我的 nginx 实例位于 SSL 终止的负载均衡器后面,我希望所有 URL 都能到达https
端点,这意味着http
重定向到https
。
当 URL 末尾有斜杠时,一切都很好。它们都会顺利重定向:
#!/bin/sh
do_curl() {
echo "\n$ do_curl $1"
curl -L -s -D - "$1" -o /dev/null | grep -iE 'Location|HTTP/|server'
}
$ do_curl https://example.com/
HTTP/2 200
$ do_curl http://example.com/foo/
HTTP/1.1 301 Moved Permanently
Location: https://example.com/foo/
HTTP/2 200
$ do_curl https://example.com/foo/
HTTP/2 200
但是当相同的 URL 没有尾随斜杠时,nginxtry_files
似乎总是发出http
重定向:
坏的.png
这是我的 nginx vhost.conf
:
server {
listen 80;
root /app/;
index index.html index.htm;
# This 'if' block is only needed because my SSL-terminated Load balancer proxies both http and https to nginx.
# If my Load balancer only proxied https to nginx, and dropped http, this 'if' block can be omitted.
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
location / {
try_files $uri $uri/ =404;
}
}
当 nginx 命中参数(上面的第二个参数)并成功找到匹配的文件(其中由上面的 nginx 配置中的指令定义)时,如何让 nginxtry_files
直接使用重定向?https
$scheme
$uri/
try_files
$uri/<index>
index
index
答案1
正如@Florin在问题的评论中指出的那样,try_files
只执行重写。所以我回去并省略了try_files
我的代码中的块vhost.conf
,果然,我得到了完全相同的行为,其中https
带有没有尾部斜杠重定向至其http
落后对应方。
解决方案
相反,我的问题标题应该更像是“如何防止 nginx 从 HTTPS 重定向到 HTTP”,这将是一个重复的问题如何防止 nginx 在 AWS 上从 HTTPS 重定向到 HTTP?@Richard 在对我的问题的评论中指出了这一点,并且他给出了回答。
巧合的是,我的情况和问题实际上与那个问题中的相同在他的回答中,@Richard 指出,缓解 nginx 与请求者(即 SSL 终止的负载均衡器)假设相同的问题的最佳方法是在负载均衡器的标头中$scheme
替换为http
,但这对我来说是不可能的。然后他继续描述https
Location
三$scheme
执行重定向时的方式https
。
在这三种解决方案中,对我有用的是使用。这可以防止 nginx 使用重定向中使用的absolute_redirect off;
错误。$scheme
现在,我的vhost.conf
只需要:
server {
listen 80;
root /app/;
index index.html index.htm;
absolute_redirect off;
# This 'if' block is only needed because my SSL-terminated Load balancer proxies both http and https to nginx.
# If my Load balancer only proxied https to nginx, and dropped http, this 'if' block can be omitted.
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
}