我对尾随 / 有一个奇怪的问题
我正在使用 nginx,它运行正常,但有一个小例外。
我有以下站点配置
server {
listen 80;
return 301 https://$server_name$request_uri/;
server_name sub1.sub2.domain.com;
}
server {
listen 443 ssl; # The ssl directive tells NGINX to decrypt
# the traffic
server_name sub1.sub2.domain.com;
ssl_certificate /etc/nginx/ssl/sub1.sub2.domain.com/server.crt; # This is the certificate file
ssl_certificate_key /etc/nginx/ssl/sub1.sub2.domain.com/server.key; # This is the private key file
location / {
proxy_pass http://1.1.1.1:8880;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
我有一个场外身份验证服务正在运行并保护一个名为安全的子文件夹,因此如果请求 /secure 或 /secure/ ,它们将被发送到场外身份验证服务。一旦他们通过身份验证,他们就会被重定向回他们最初请求的任何 url。如果在身份验证后他们碰巧请求 /secure/ 一切正常。如果他们键入 /secure(没有尾随 /),nginx 在身份验证后执行 301 重定向并将 https 替换为 http,因此他们到达http://sub1.sub2.domain.com/secure,然后通过另一个重定向返回 https
从我在这里读到的http://nginx.org/en/docs/http/ngx_http_core_module.html#location这是正确的行为,但是将 /secure/ 和 /secure 定义为单独的位置文件的解决方案没有似乎有效,并且在该示例中也没有提及有关 https 到 http 更改的任何内容。任何帮助将不胜感激。
您在重定向中明确添加斜杠:
这显然不是你想要的。
所以不要添加尾部斜杠:
您的应用程序对此负责,这是因为您需要使用额外的标头转发当前方案,例如
X-Forwarded-Proto
自从您禁用proxy_redirect
后,这意味着重定向从您的上游服务器保持不变并直接发送给访问者,而不需要 nginx 使其相对于位置上下文或方案在当前服务器块中使用。所以在那里修复它或使用 nginx 的
proxy_redirect
相关方式。所以事实证明文档是正确的(谁知道),我在尝试解决尾随 / 的第一个问题时引入了更多问题
通过进行以下更改,我能够解决此问题。
(删除尾随 / 用于 http 重定向)
这将对在进入身份验证服务之前未将 / 置于安全末尾的任何人执行重定向。
这会将应用程序的每个 http 重定向重写为 https