Nginx
Nginx 通過代理重定向、重寫和保留 URL
在 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 伺服器收到的請求 URL
http://192.168.1.24
包含/some/path
並因此無法提供所需的頁面。- 提供頁面後,當您將滑鼠懸停在連結上時,
/some/path
URL 中缺少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; }