Nginx

Nginx 通過代理重定向、重寫和保留 URL

  • August 27, 2017

在 Nginx 中,我們一直在嘗試重定向 URL,如下所示:

http://example.com/some/path -> http://192.168.1.24

使用者仍然可以在瀏覽器中看到原始 URL。一旦使用者被重定向,假設他們點擊連結到/section/index.html,我們希望它發出一個導致重定向的請求

http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html

並再次保留原始 URL。

我們的嘗試涉及使用代理和重寫規則的各種解決方案,下面顯示了使我們最接近解決方案的配置(請注意,這是 Web 伺服器的 Web 伺服器配置example.com)。但是,這樣做仍然存在兩個問題:

  • 它無法正確執行重寫,因為 Web 伺服器收到的請求 URLhttp://192.168.1.24包含/some/path並因此無法提供所需的頁面。
  • 提供頁面後,當您將滑鼠懸停在連結上時,/some/pathURL 中缺少
server {
   listen          80;
   server_name     www.example.com;

   location /some/path/ {
       proxy_pass http://192.168.1.24;
       proxy_redirect http://www.example.com/some/path http://192.168.1.24;
       proxy_set_header Host $host;
   }

   location / {
       index index.html;
       root  /var/www/example.com/htdocs;
   }
}

我們正在尋找一種僅涉及更改example.com. 我們可以更改192.168.1.24(也包括 Nginx)上的配置,但是我們想嘗試避免這種情況,因為我們需要為數百個通過代理訪問的不同伺服器重複此設置example.com

首先,您不應該root在 location 塊中使用指令,這是一種不好的做法。在這種情況下,這並不重要。

嘗試添加第二個位置塊:

location ~ /some/path/(?<section>.+)/index.html {
   proxy_pass http://192.168.1.24/$section/index.html;
   proxy_set_header Host $host;
}

這會將 /some/path/ 之後和 index.html 之前的部分擷取到 $section 變數,然後用於設置 proxy_pass 目標。如果需要,您可以使正則表達式更具體。

proxy_pass您應該在指令中使用 URI 部分。此外,您混淆了proxy_redirect指令的順序參數,可能根本不需要它。Nginx 對該指令有合理的預設值。

在這種情況下,您的location塊可能非常簡單:

location /some/path/ {
   proxy_pass http://192.168.1.24/;
   # note this slash  -----------^
   proxy_set_header Host $host;
}

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