Nginx

當尾隨斜杠不在 URI 中時,如何 停止 nginx 301 自動重定向?

  • February 15, 2021

每次我在瀏覽器中嘗試 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_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)

引用自:https://serverfault.com/questions/759762