解决方案

解决方案

我的 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>indexindex

我搜索了类似的问题,例如这里这里, 或者这里但仍然找不到任何相关的东西。

答案1

正如@Florin在问题的评论中指出的那样,try_files只执行重写。所以我回去并省略了try_files我的代码中的块vhost.conf,果然,我得到了完全相同的行为,其中https带有没有尾部斜杠重定向至其http 落后对应方。

解决方案

相反,我的问题标题应该更像是“如何防止 nginx 从 HTTPS 重定向到 HTTP”,这将是一个重复的问题如何防止 nginx 在 AWS 上从 HTTPS 重定向到 HTTP?@Richard 在对我的问题的评论中指出了这一点,并且他给出了回答。

巧合的是,我的情况和问题实际上与那个问题中的相同在他的回答中,@Richard 指出,缓解 nginx 与请求者(即 SSL 终止的负载均衡器)假设相同的问题的最佳方法是在负载均衡器的标头中$scheme替换为http,但这对我来说是不可能的。然后他继续描述httpsLocation$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;
    }
}

相关内容