修改 HTTP 回應標頭

作者 :魯斯蘭·雅庫舍夫

本文件部分適用於 IIS 7 的 URL 重寫模組版本 2.0

本教學將引導你了解如何使用 URL Rewrite Module v 2.0 來設定 HTTP 回應標頭。

先決條件

此操作指南需要具備以下條件:

  1. IIS 7 或更新版本且已啟用 ASP.NET 角色服務;
  2. URL 重寫模組 2.0 候選版本已安裝;
  3. 已完成 使用 URL Rewrite v2 和應用程式請求路由的反向代理的操作。

簡介

URL 重寫模組 2.0 提供基於規則重寫回應 HTTP 標頭的支援。 設定回應標頭的一個非常常見的使用情境是修改應用程式在負載平衡器或反向代理後產生的重定向回應。 例如,當反向代理背後的應用程式回傳重定向回應時,回應中的 HTTP Location 標頭可能不代表面向網際網路的位址,而是內部應用程式位址。 URL Rewrite Module 2.0 可用於反向代理伺服器,修改回應中的 Location 標頭。 情境如下圖所示:

圖示顯示用戶端、反向代理伺服器與內部用戶端伺服器之間的重定向回應過程。

  1. HTTP 用戶端會向網頁 http://www.contoso.com/webmail/oldpage.aspx發送請求。
  2. 反向代理伺服器使用 URL 重寫 2.0 與應用程式請求路由(Application Request Routing),根據請求 URL 路徑中資料夾名稱,將請求轉發至內部內容伺服器。 例如, http://webmail/oldpage.aspx;
  3. 在內容伺服器上執行的網頁應用程式會發出一個重定向回應(HTTP/1.1 301),將 HTTP 用戶端導向至http://webmail/newpage.aspx
  4. 反向代理伺服器使用 URL Rewrite 2.0 將回應中基於內部的重定向位置替換為基於網際網路的重定向位置: http://www.contoso.com/webmail/newpage.aspx

設置演練場景

要設定攻略情境,請完成 關於 URL Rewrite v2 及應用程式請求路由的反向代理攻略。 在操作結束時,你應該會有一個反向代理伺服器網站,將請求導向兩個內容應用程式:網路郵件和薪資。

這次攻略需要為網頁郵件應用程式新增一個重定向邏輯。 在實際情況下,這通常是由網頁應用程式程式碼發起的重定向,但為了簡化起見,在這個教學中你會在 URL 重寫模組中使用一個重定向規則。

  1. 在以下資料夾中建立一個名為 web.config 的檔案:

    %SystemDrive%\inetpub\webmail
    
  2. 在文字編輯器中開啟檔案,貼上以下 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,基本上是網頁郵件應用程式使用的內部網址。 接著你要設定 URL Rewrite 規則,修改 HTTP 重定向回應中的 HTTP Location 標頭,使瀏覽器被重新導向到正確的 URL: http://localhost/webmail/default.aspx

修改入站規則以保留主機標頭

為了能夠修改 HTTP Location 標頭,必須保留 HTTP 主機標頭的原始值。 外發重寫規則在修改回應時使用保留值。 為了保留原始值,將它儲存在暫時的伺服器變數ORIGINAL_HOST中。

  1. 在主網址重寫功能檢視頁面,請在右側的動作面板中選擇「檢視伺服器變數」
    在動作面板中「管理伺服器變數」下的檢視伺服器變數截圖。
  2. 在允許的 伺服器變數 頁面中,選擇 新增 ,然後輸入將用來暫時儲存 HTTP Host 標頭值的伺服器變數名稱。 例如,ORIGINAL_HOST:
    伺服器變數名稱設為 ORIGINAL 的截圖,底線為 HOST。
  3. 選擇 確定 以儲存變更,然後返回主網址重寫功能檢視頁面。 之後,選擇「反向代理到網頁郵件」的入站規則,並選擇 編輯
  4. 編輯入站規則 頁面,展開「伺服器變數」群組框;然後選擇 新增 ,並將伺服器變數名稱輸入「ORIGINAL_HOST」,以及「值」輸入「{HTTP_HOST}」:
    編輯入站規則頁面的截圖,將設定伺服器變數值設為捲括號 H T T P 底線標示 HOST 捲括號。

建立一個外發規則來修改 HTTP 回應標頭

接著你會建立一條外站重寫規則,將 HTTP Location 標頭在 redirection 回應中重寫,將應用程式資料夾重新加入 URL 路徑,並替換主機名稱。

  1. 在主網址重寫功能檢視頁面,選擇「新增規則」,然後在「外發規則」類別中選擇「空白規則」。
  2. 在「編輯外發規則」頁面,將規則命名為「重寫位置標頭」。
  3. 在「預設條件」下拉選單中,選擇「<建立新的預設條件>」。
  4. 在「新增前置條件」對話框中,將前置條件命名為「IsRedirection
  5. 選擇「新增」,然後輸入 {RESPONSE_STATUS} 作為條件輸入,「3\d\d」作為模式。 此前置條件用來檢查回應是否有重定向狀態碼,如301、302、307等。 前置條件對話框應類似以下內容:
    捲括號截圖 回應 強調 STATUS 捲括號設定為輸入,3 個反斜線 d 反斜線 d 作為模式。
  6. 選擇 確定 可返回 「編輯外發規則 」頁面。
  7. Match 群組框中,使用 Matching 範圍 下拉選單選擇 伺服器變數
  8. 輸入 RESPONSE_Location 表示「變數名稱」,輸入「^http://[^/]+//(.*)」表示「模式」。 此規則設定為對回應 HTTP 標頭「Location」進行操作,並將其值與將 URL 路徑儲存回溯參考的正則表達式模式匹配。
  9. 展開「條件」群組框,選擇「新增」,輸入 {ORIGINAL_HOST} 作為條件輸入,以及「.+」作為條件模式。 此條件檢查臨時伺服器變數 ORIGINAL_HOST 是否存在且值非空。
  10. 選擇 再加 一次,再加一個條件。 將條件輸入設為 {URL} ,模式設為「^/(webmail|payroll)/.*」。 此正則表達式用於匹配以 /webmail 或 /payroll 開頭的 URL 路徑。 此外,模式中的括號會捕捉匹配 URL 字串的部分,以便在構建替換 URL 時可重複使用。
  11. 最後,在「動作」群組框中選擇「重寫」動作,並輸入「http://{ORIGINAL_HOST}/{C:1}/{R:1}」作為值。 此動作將 HTTP Location 標頭的值替換為由伺服器變數的主機名稱、包含 URL 路徑資料夾前綴的條件反向參考,以及包含 Location 標頭中當前 URL 路徑的規則反向參照所構成的字串。

完整頁面應該如下:

編輯出站規則窗格的截圖,其中條件輸入為 ORIGINAL HOST 和 URL。

測試規則

為了測試規則是否正確運作,請打開網頁瀏覽器並向 發出請求。http://localhost/webmail/index.aspx 瀏覽器應該會被重新導向到 http://localhost/webmail/default.aspx

瀏覽器截圖顯示原始 URL 重新導向至新 URL。

總結

在本逐步解說中:

  • 你已經學會了如何使用 URL Rewrite 2.0 中的多項新功能,來實作一個功能完整的反向代理情境。
  • 你已經設定了入站規則,將請求轉發到後端內容伺服器,並設定一個臨時伺服器變數。
  • 接著你定義了一個外站規則,修改網頁應用程式從後端內容伺服器產生的重定向回應中的 HTTP 位置標頭。