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

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

每次我在浏览器中尝试 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;
        }
}

答案1

根据文档,针对这种情况有一种特殊的处理:

如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由 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;
}

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

相关内容