Nginx
當尾隨斜杠不在 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; } }
根據文件,這種情況有一種特殊的處理方式:
如果位置由以斜杠字元結尾的前綴字元串定義,並且請求由 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)