![nginx 在 proxy_pass 重定向期間切斷部分路徑](https://rvso.com/image/726394/nginx%20%E5%9C%A8%20proxy_pass%20%E9%87%8D%E5%AE%9A%E5%90%91%E6%9C%9F%E9%96%93%E5%88%87%E6%96%B7%E9%83%A8%E5%88%86%E8%B7%AF%E5%BE%91.png)
我正在設定一個反向代理,該代理接收來自聯合身份驗證伺服器的請求並將它們轉發到我的後端應用程式。當請求缺少尾部斜線時,nginx 會執行預設的 301 重定向,但它重定向到的位址不包含位置區塊中匹配的路徑。這個想法是代理來自Gunicorn 中upstream.com/myApp
根 url 的請求。backend.com/
我的配置是:
geo $allow {
default 0;
<upstream ip> 1;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
set_real_ip_from <backend ip>;
real_ip_header X-Forwarded-For;
if ($allow = 0) {
return 444;
}
server_name backend.com;
underscores_in_headers on;
include snippets/<ssl-conf>;
include snippets/<ssl-params>;
location /<myApp>/static/ {
root /<path>/<myApp>/static;
}
location /<myApp>/ {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass http://unix:/<path>/<myApp>/<myApp>.sock:/;
}
location = /<myApp> {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass
http://unix:/<path>/<myApp>/<myApp>.sock:/;
}
}
upstream.com/myApp
最初我只包含第一個位置塊,但是當來自(沒有尾部斜杠)的請求發生時,nginx 會重定向到backend.com/myApp/
,並且不會轉發原始請求的標頭。新增第二個位置區塊以防止重定向修復了該問題。
然而,現在,如果我收到類似(再次,沒有尾部斜杠)的請求upstream.com/myApp/search
,它會執行 301 重定向到upstream.com/search/
(添加尾部斜杠,但這部分已經消失了。在nginx 進行重定向後,如何保留url 中的部分?
答案1
我又做了一些調試,最後發現這不是 Nginx 的問題。相反,這是 Django 沒有將 nginx 代理過濾掉的路徑附加到重定向的問題。
答案2
這不是 Nginx 的問題,而是 Nginx 的功能。如果您不希望 Nginx 刪除與您的位置區塊相符的路徑部分,那麼您的 proxy_pass 指令不得在 server:port 或 socket 之後指定路徑。
這僅包括末尾的尾部斜杠,您指定的任何路徑都將替換位置塊的匹配部分,如果您僅指定斜杠,則它具有刪除匹配部分的效果