Nginx

NGINX 反向代理重寫規則與 proxy_redirect

  • March 2, 2020

我在一些 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;

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