Nginx
Nginx 反向代理 + URL 重寫
Nginx 在埠 80 上執行,我使用它來反向代理 URL 與
/foo
埠路徑3200
這種方式:location /foo { proxy_pass http://localhost:3200; proxy_redirect off; proxy_set_header Host $host; }
這很好用,但是我在 port 上有一個應用程序
3200
,我不希望將初始/foo
值發送到該應用程序。也就是說 - 當我訪問時http://localhost/foo/bar
,我只想/bar
成為應用程序接收到的路徑。所以我嘗試將此行添加到上面的位置塊中:rewrite ^(.*)foo(.*)$ http://localhost:3200/$2 permanent;
這會導致 302 重定向(URL 更改),但我想要 301。我該怎麼辦?
對遠端系統(例如客戶端的 Web 瀏覽器)的任何重定向到 localhost 都沒有意義。因此,永久重寫標誌(301)或重定向(302)在您的情況下不可用。
請嘗試使用透明重寫規則進行以下設置:
location /foo { rewrite /foo/(.*) /$1 break; proxy_pass http://localhost:3200; proxy_redirect off; proxy_set_header Host $host; }
用於
curl -i
測試您的重寫。對規則進行非常細微的更改可能會導致 nginx 執行重定向。
只要您在 proxy_pass 指令中指定 URI,簡單的位置前綴匹配就可以在不使用重寫規則的情況下工作:
location /foo { proxy_pass http://localhost:3200/; }
請注意指令
/
末尾的附加內容。proxy_pass
NGINX 將去除匹配的前綴/foo
並將剩餘部分通過 URI 傳遞給後端伺服器/
。因此,http://myserver:80/foo/bar
將發佈到後端http://localhost:3200/bar
。如果 proxy_pass 指令使用 URI 指定,則當請求傳遞到伺服器時,與位置匹配的規範化請求 URI 部分將替換為指令中指定的 URI: