![当尾部斜杠不在 URI 中时,如何停止 nginx 301 自动重定向?](https://linux22.com/image/677721/%E5%BD%93%E5%B0%BE%E9%83%A8%E6%96%9C%E6%9D%A0%E4%B8%8D%E5%9C%A8%20URI%20%E4%B8%AD%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%81%9C%E6%AD%A2%20nginx%20301%20%E8%87%AA%E5%8A%A8%E9%87%8D%E5%AE%9A%E5%90%91%EF%BC%9F.png)
每次我在浏览器中尝试 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_pass 之一处理,则将执行特殊处理。响应 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)