我有一個位置
location /pass/ {
proxy_pass http://localhost:12345/;
}
所以它應該代理http://example.com/pass/whatever
urlhttp://localhost:12345/whatever
我不喜歡的是 nginx 會自動添加斜杠
http://example.com/pass
http://example.com/pass/
並透過 301 重定向實現
我怎樣才能簡單地避免這種行為。我想要/pass
不帶尾部斜槓去另一個位置。先致謝!
答案1
有一種特殊情況,以 in 結尾的 aproxy_pass
會location
導致/
自動隱式301
重定向,而無需轉到後端;您必須建立一個location
不帶尾部斜線的明確以避免這種情況:
如果位置由以斜線字元結尾的前綴字串定義,並且請求由 proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass 或 grpc_pass 之一處理,則執行特殊處理。為了回應 URI 等於此字串但沒有尾部斜線的請求,將傳回帶有代碼 301 的永久重定向到所請求的 URI,並附加斜線。如果不需要這樣做,可以像這樣定義 URI 和位置的精確匹配:
location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }
例如,/pass
location
除了現有的之外,您還必須建立一個明確的/pass/
,否則,location /pass {return 301 /pass/…;}
將為您建立一個隱式的。
然而,你確定你真的想做你想做的事嗎?如果您要省略從/pass
to 的重定向/pass/
,則相對路徑將無法運作。一些較新的瀏覽器也傾向於具有缺陷的 UI/UX,可能不會向用戶顯示尾部斜杠,這可能會使在嘗試解決差異問題時變得更加混亂。
答案2
正如你想要的那樣另一個地點,一個自然的解決方案是添加該位置
location /pass {
}
預設情況下,nginx 將在 Web 根目錄中尋找名為「pass」的檔案。如果您不喜歡這個預設值,您可以在這個新的位置區塊中添加更多指令來實現這一點。
您也可以使用
location = /pass {
}
這樣 nginx 就能更快找到匹配項。