Nginx 301将httpsredirect到http

我有一个奇怪的问题,尾随/

我正在使用nginx,它有一个小例外正常运行。
我有以下网站configuration

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; } } 

我有一个异地身份validation服务正在运行并保护一个称为安全的子文件夹,因此如果请求/ secure或/ secure /请求,它们将被发送到非站点身份validation服务。 一旦他们被authentication,他们被redirect到他们最初要求的任何url。 如果authentication后,他们碰巧要求/安全/一切正常工作。 如果他们input/ secure(不跟踪/),nginx会在authentication之后进行301redirect,并用httpreplacehttps,以便他们访问http://sub1.sub2.domain.com/secure ,然后再通过另一个redirect返回到https

从我在这里阅读http://nginx.org/en/docs/http/ngx_http_core_module.html#location这是正确的行为,但解决scheme定义/安全/和/安全作为单独的位置文件不似乎工作,也没有提到有关https到http更改的示例中的任何内容。 任何帮助将不胜感激。

你的应用程序负责这个,这是因为你需要转发当前的计划与额外的proxy_redirectX-Forwarded-Proto因为你禁用了proxy_redirect ,这意味着redirect保持原样从你的上游服务器,并直接发送到访问者没有nginx使其相对位置上下文或当前服务器块中正在使用的scheme。

因此,修正它或使用nginx的proxy_redirect的方式。

您明确地在您的redirect中添加了斜线:

 return 301 https://$server_name$request_uri/; 

这显然不是你想要的。

所以不要添加尾部的斜线:

 return 301 https://$server_name$request_uri; 

所以事实certificate文件是正确的(谁知道),我已经介绍了更多的问题,同时试图解决第一个问题的尾随/

我能够通过进行以下更改来解决问题。

 return 301 https://$server_name$request_uri; 

(删除尾随/ httpredirect)

 location = /secure { return 301 https://$server_name$request_uri/; } 

这为执行身份validation服务之前没有进行安全保护的任何人执行redirect。

 proxy_redirect http:// $scheme://; 

这会将每个httpredirect从应用程序重写为https