修改 HTTP 回應標頭
作者: Ruslan Yakushev
本檔章節適用於 適用於 IIS 7 的 URL 重寫模組 2.0 版。
本逐步解說會引導您瞭解如何使用URL重寫模組 v2.0來設定 HTTP 回應標頭。
必要條件
本逐步解說需要下列必要條件:
- 已啟用 ASP.NET 角色服務的 IIS 7 或更新版本;
- 已安裝 URL 重寫模組 2.0 候選版;
- 已完成 使用 URL 重寫 v2 和應用程式要求路由的反向 Proxy 逐步解說。
簡介
URL Rewrite Module 2.0 支援以規則為基礎的回應 HTTP 標頭重寫。 設定回應標頭的常見使用案例是修改負載平衡器或反向 Proxy 後方應用程式所產生的重新導向回應。 例如,當反向 Proxy 後面的應用程式傳回重新導向回應時,回應中的 HTTP 位置標頭可能不會代表因特網面向的位址,而是內部應用程式位址。 URL Rewrite Module 2.0 可用於反向 Proxy 伺服器上,以修改回應中的Location標頭。 此案例會在下圖中表示:
- HTTP 用戶端會對網頁
http://www.contoso.com/webmail/oldpage.aspx
提出要求。 - 反向 Proxy 伺服器會使用 URL Rewrite 2.0 和應用程式要求路由,根據要求之 URL 路徑中的資料夾名稱,將要求轉送至內部內容伺服器。 例如,
http://webmail/oldpage.aspx
; - 在內容伺服器上執行的 Web 應用程式會發出重新導向回應, (HTTP/1.1 301) 將 HTTP 用戶端
http://webmail/newpage.aspx
指向 ; - 反向 Proxy 伺服器會使用 URL Rewrite 2.0,將回應中的內部重新導向位置取代為以因特網為基礎的重新導向位置:
http://www.contoso.com/webmail/newpage.aspx
。
設定逐步解說案例
若要設定逐步解說案例,請完成 使用URL重寫 v2和應用程式要求路由進行反向 Proxy 的逐步解說。 在該逐步解說結束時,您應該會有反向 Proxy 網站,將要求路由傳送至兩個內容應用程式:Webmail 和薪資。
在此逐步解說中,您必須將重新導向邏輯新增至 Webmail 應用程式。 在真實案例中,這可能是 Web 應用程式程式代碼起始的重新導向,但為了簡單起見,在本逐步解說中,您將在 URL 重寫模組中使用重新導向規則。
在下列資料夾中建立名為 web.config 的檔案:
%SystemDrive%\inetpub\webmail
在文字編輯器中開啟檔案,在 內貼上下列 XML 程式代碼,然後儲存盤案:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Redirect" stopProcessing="true"> <match url="^index\.aspx$" /> <action type="Redirect" url="default.aspx" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
這是將 index.aspx 的所有要求重新導向至 default.aspx 的規則。
現在開啟網頁瀏覽器並提出要求 http://localhost/webmail/index.aspx
。 請注意,瀏覽器已重新導向至 http://localhost:8081/default.aspx
,這基本上是 Webmail Web 應用程式所使用的內部 URL。 現在,您將設定 URL 重寫規則來修改 HTTP 重新導向回應中的 HTTP 位置標頭,讓瀏覽器重新導向至適當的 URL: http://localhost/webmail/default.aspx
。
修改輸入規則以保留主機標頭
若要能夠修改 HTTP 位置標頭,必須保留 HTTP 主機標頭的原始值。 修改回應時,輸出重寫規則會使用保留的值。 若要保留原始值,請將它儲存在暫存伺服器變數ORIGINAL_HOST中。
- 在主要 URL 重寫功能檢視頁面中,選取右側 [動作] 窗格中的 [檢視伺服器變數]:
- 在 [ 允許的伺服器變數 ] 頁面中,選取 [ 新增 ],然後輸入將用來暫時儲存 HTTP 主機標頭值的伺服器變數名稱。 例如,ORIGINAL_HOST:
- 選取 [確定 ] 以儲存變更,然後返回主要 URL 重寫功能檢視頁面。 之後,選取 [反向 Proxy 至 Webmail] 輸入規則,然後選取 [ 編輯]。
- 在 [ 編輯輸入規則] 頁面中,展開 [伺服器變數] 群組方塊;然後選取 [新增 ],然後輸入 “ORIGINAL_HOST” 做為伺服器變數名稱和 “{HTTP_HOST}” 做為 “Value”:
建立輸出規則以修改 HTTP 回應標頭
現在,您將建立輸出重寫規則,以重寫重新導向回應中的 HTTP 位置標頭,以將應用程式資料夾加回 URL 路徑,並取代主機名。
- 在主要 URL 重寫功能檢視頁面中,選取 [新增規則],然後在 [輸出規則] 類別下選取 [空白規則]。
- 在 [編輯輸出規則] 頁面中,將規則命名為 「重寫位置標頭」。
- 在 [預先條件] 下拉式清單中,選擇 [<建立新的預先條件>]。
- 在 [新增前置條件] 對話框中,將前置條件命名為 “IsRedirection”
- 選取 [新增],然後輸入 {RESPONSE_STATUS} 作為條件輸入,然後輸入 “3\d\d” 作為模式。 此先決條件可用來檢查回應是否有重新導向狀態代碼,例如 301、302、307 等等。 前置條件對話框看起來應該如下所示:
- 選取 [確定 ] 以傳回 [編輯輸出規則] 頁面。
- 在 [ 比對 ] 群組方塊中,使用 [ 比對範圍 ] 下拉式清單來選取 [伺服器變數]。
- 輸入 “Variable name” 和 “^http://[^/]+/ (.*) ”for the “Pattern” 的 RESPONSE_Location。 這會設定規則以在回應 HTTP 標頭 「Location」 上運作,並將其值與儲存 URL 路徑的 Regex 模式比對為回參考。
- 展開 [條件] 群組方塊,選取 [新增],然後輸入 {ORIGINAL_HOST} 作為條件輸入,然後輸入 “.+” 作為條件模式。 此條件會檢查暫存伺服器變數ORIGINAL_HOST是否存在,且具有非空白值。
- 選取 [ 再 新增一次],然後新增另一個條件。 將條件輸入設定為 {URL} ,並將模式設定為 “^/ (webmail|薪資) /.*”。 此正則表達式用來比對以 /webmail 或 /薪資開頭的URL路徑。 此外,模式內的括號會擷取相符 URL 字串的一部分,以便在建構取代 URL 時重複使用。
- 最後,在 [動作] 群組方塊中,選擇 [重寫] 動作,然後輸入 “
http://{ORIGINAL_HOST}/{C:1}/{R:1}
” 作為值。 此動作會將 HTTP 位置標頭的值取代為使用伺服器變數主機名所建構的字串、包含 URL 路徑資料夾前置詞的條件反向參考,以及包含 Location 標頭中目前 URL 路徑的規則反向參考。
完整頁面看起來應該如下所示:
測試規則
若要測試規則是否正確運作,請開啟網頁瀏覽器,並向 http://localhost/webmail/index.aspx
提出要求。 瀏覽器應該重新導向至 http://localhost/webmail/default.aspx
:
摘要
在本逐步解說中:
- 您已瞭解如何在 URL Rewrite 2.0 中使用數項新功能,以實作功能完整的反向 Proxy 案例。
- 您已設定輸入規則,將要求轉送至後端內容伺服器,以及設定暫存伺服器變數。
- 接著,您已定義輸出規則,以修改 Web 應用程式從後端內容伺服器產生的重新導向回應中的 HTTP 位置標頭。