防止帶有 UrlRewrite 的 ARR 為 302 重定向重寫 Location 標頭
我正在嘗試使用 ARR 和 urlrewrite 部署碼頭 servlet 以創建反向代理。如果我啟用“在響應標頭中反向重寫主機”,那麼一切似乎都正常。我在 www.example.com/servlet 訪問 servlet,地址在瀏覽器中保持不變,但在 localhost:8080 訪問 servlet。
問題是這個 servlet 根據 get 參數返回 302 重定向。因此,例如,如果我訪問 www.example.com/servlet?input=cleaning,那麼我將獲得一個 302 重定向,該重定向可能會訪問 www.cleaningexample.com/howtoclean。反向重寫主機規則意味著客戶端不會看到這個 url,而是返回 www.example.com/howtoclean。
我無法設置靜態出站規則,因為我事先不知道 302 重定向可能返回哪個地址。
如果我禁用反向重寫主機,則瀏覽器中的 url 從 www.example.com/servlet 更改為 localhost:8080/servlet。
我嘗試在出站規則中替換主機,但我找不到任何地方來獲取 servlet 返回的原始位置標頭以替換重寫的位置主機。
有沒有辦法讓它正常工作?
你有沒有想過這個?我有完全相同的問題。我無法讓這兩種情況都正常執行。要麼我選中該框,然後 302 重定向將覆蓋響應位置標頭並且永遠不會工作,要麼我取消選中該框並且 HOST 標頭是 localhost,因此應用程序無法完全工作。
就像那個複選框需要更聰明一點,並說’如果不是 302,就這樣做’。或者我必須在之前和之後添加規則,但我認為這是不可能的。:-(
—- 20分鐘後,真的很幸運,找到了答案。
https://stackoverflow.com/a/14842856/8333628
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost
該命令,加上響應頭中的反向重寫主機 UNCHECKED 似乎有效。外部重定向在未選中該框的情況下工作,並且使用該命令保留主機,下游應用程序不再看到 localhost:8080 而是在瀏覽器地址欄中看到原始主機。兩者都工作!
有趣的是,在 UI 中沒有用於 preserveHostHeader 的選項。他們只是從未添加過複選框。:) 如果您進入控制面板中的“配置編輯器”,您可以在 xml 架構中看到它。所以這是一個合法的設置,他們只是在 UI 選項中錯過了它。:(