Nginx

Nginx 反向代理 + URL 重寫

  • July 11, 2019

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_passNGINX 將去除匹配的前綴/foo並將剩餘部分通過 URI 傳遞給後端伺服器/。因此,http://myserver:80/foo/bar將發佈到後端http://localhost:3200/bar

來自proxy_pass 上的 NGINX 文件

如果 proxy_pass 指令使用 URI 指定,則當請求傳遞到伺服器時,與位置匹配的規範化請求 URI 部分將替換為指令中指定的 URI:

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