Nginx
NGINX 反向代理重寫規則與 proxy_redirect
我在一些 IIS 託管應用程序前將 NGINX 作為反向代理執行。我的目標是為特定位置制定重寫規則。問題是應用程序本身在某些情況下會以 301 或 302 響應。這提供了一個新的位置標頭,然後我也需要解決它。
所以基本上我嘗試做的是: - https://mydemo.app.de/abc應該出現在瀏覽器中,但 /xyz 應該被傳遞而不是 /abc。這很好用,即使有重定向 (301/302)。
這是我的“半工作”配置:
location ~* /abc { rewrite (?i)/abc/(.*) /xyz/$1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_pass http://mydemo.app.local; proxy_redirect ~*(.*)\/xyz\/(.*) $1/abc/$2; proxy_pass_header Server; # Handle Web Socket connections proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; }
現在有時上游伺服器會返回以下內容:login.aspx?ReturnUrl=/xyz/ 可以在瀏覽器中讀取。這不應該是這樣。/abc/ 也應該有。據我了解,proxy_redirect 部分應該處理這個問題,但在我的情況下不知何故。
有什麼方法可以在不更改應用程序本身的情況下使其工作(這會導致更大的變化……)?
任何幫助深表感謝。
如果您有兩個文本序列實例
/xyz/
都需要用 替換/abc/
,您將需要編寫一個正則表達式來匹配兩者並擷取三個中間間隙。但是,您需要保留現有的
proxy_redirect
語句來處理只有一個的情況。與許多評估正則表達式的 Nginx 指令一樣,順序可能很重要,所以我會先放置更具體的表達式。
例如:
proxy_redirect ~*(.*)/xyz/(.*)/xyz/(.*)$ $1/abc/$2/abc/$3; proxy_redirect ~*(.*)/xyz/(.*)$ $1/abc/$2;