当尾随斜杠不在 URI 中时,如何停止 nginx 301 自动重定向?

Geo*_* C. 7 nginx reverse-proxy 301-redirect apache-2.4

每次我在浏览器中尝试 foobar.com/test 时,nginx 似乎都会将客户端重定向(301)到 foobar.com/test/。这种行为是不可接受的。代理服务器是远程 Apache Web 服务器。我曾尝试直接调用 Apache 服务器(没有代理),但它不会重定向客户端。

考虑到下面的 nginx 服务器配置,知道我应该如何解决这个问题吗?

server {
        listen 80;
        server_name fooBar.com;

        location /test {
                proxy_redirect off;
                proxy_pass http://1.1.1.1:80/;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }


        location /test/ {
                proxy_redirect off;
                proxy_pass http://1.1.1.1:80/;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}
Run Code Online (Sandbox Code Playgroud)

fam*_*kin 14

根据文档,此场景有一种特殊的处理方式:

如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass 或 memcached_pa​​ss 之一处理,则执行特殊处理。响应URI 等于该字符串但没有尾部斜杠的请求,带有代码301 的永久重定向将返回到附加斜杠的请求URI。如果不需要,可以像这样定义 URI 和位置的精确匹配:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user {
    proxy_pass http://login.example.com;
}
Run Code Online (Sandbox Code Playgroud)

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

  • 哦,我多么希望早点找到这个金块。这个“特殊处理”似乎有一个错误,因为返回的 301 似乎总是使用服务器配置的侦听部分的端口,并且似乎忽略了所有与代理端口相关的参数。例如,当服务器在外部 443 上可见,但正在侦听 docker 容器内的端口 8443 时,这会破坏事情。301 重定向以端口 8443 结束,并失败。上面的解决方案是完美的。 (2认同)