Share via


設定 HTTP 要求標頭和 IIS 伺服器變數

作者 :Ruslan Yakushev

本檔的這一節適用于 IIS 7 的 URL 重寫模組 2.0版。

本逐步解說將引導您使用 URL 重寫模組 v 2.0 來設定 HTTP 要求標頭和 IIS 伺服器變數。

必要條件

本逐步解說需要下列必要條件:

  1. 已啟用 ASP.NET 角色服務的 IIS 7.0 或更新版本
  2. 已安裝 URL 重寫模組 2.0

設定逐步解說案例

為了示範如何使用 URL 重寫模組 2.0 來設定 HTTP 標頭和 IIS 伺服器變數,我們將實作一個案例,其中要求上的 HTTP Cookie 標頭是根據要求的 URL 進行設定。 例如,假設您有提供當地語系化網頁的 Web 應用程式。 Web 應用程式會根據要求中的 HTTP Cookie 來決定回應的語言。 這種方法的問題在於搜尋引擎不會為此應用程式的當地語系化內容編制索引,因為搜尋引擎編目程式不會使用 HTTP Cookie,因此 Web 應用程式只會提供預設語言的內容。 若要克服此問題,您決定將語言的相關資訊新增為 URL 的一部分, http://www.contoso.com/default.aspx 例如 ,然後使用 URL 重寫模組 2.0 來設定 Web 應用程式預期用來判斷回應語言的 Cookie。 此外,您想要設定另一個名為 ORIGINAL_URI 的伺服器變數,其中包含原始要求的 URI 字串。

若要設定逐步解說案例,請複製下列 ASP.NET 程式碼,並將其放在 %SystemDrive%\inetpub\wwwroot\ 名為 language.aspx的檔案資料夾中:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>URL Rewrite Module v2 Test - Setting Server Variables</title>
</head>
<body>
 <h1>Setting HTTP request header and a server variable with URL Rewrite Module v2</h1>
 <p>The value of the Language cookie is <strong><%=( Request.Cookies["Language"] != null ) ? Request.Cookies["Language"].Value : "Cookie not set" %></strong></p>
 <p>The originally requested URI is <strong><%= HttpUtility.HtmlEncode( Request.ServerVariables["ORIGINAL_URI"] ) %></strong></p>
</body>
</html>

複製此檔案之後,請流覽至 http://localhost/language.aspx ,並檢查頁面是否已在瀏覽器中正確轉譯。

建立重寫規則

您將建立重寫規則,以使用下列格式重寫 URL:

http://localhost/<language>/anyfile.aspx
將會重寫為:
http://localhost/anyfile.aspx

重寫規則也會設定兩個 IIS 伺服器變數:

  • HTTP_COOKIE
  • ORIGINAL_URI

您將使用 IIS 管理員中的 URL 重寫 UI 來建立重寫規則。

開啟 IIS 管理員,在左側的樹狀檢視中選擇 [預設網站],然後開啟 [URL 重寫] 功能:

I S 管理員的預設網站首頁畫面螢幕螢幕擷取畫面,其中焦點位於 [U R L 重寫] 選項。

允許變更伺服器變數

根據預設,分散式重寫規則 (也就是針對特定網站或 Web 應用程式定義的規則,) 無法設定或變更任何 IIS 伺服器變數,除非伺服器變數已新增至 「允許」清單。 在此逐步解說中,您必須將下列兩個伺服器變數新增至 [允許的伺服器變數] 清單:

  • HTTP_COOKIE
  • ORIGINAL_URI

注意

[允許的伺服器變數] 清單不適用於伺服器層級上定義的全域規則。 如果使用全域重寫規則來設定伺服器變數,則不需要將該伺服器變數新增至 [允許] 清單。

選取 [檢視伺服器變數...]來自 [動作] 窗格的動作:

U R L 重寫畫面的螢幕擷取畫面,其中焦點位於 [動作] 窗格中的 [檢視伺服器變數] 選項。

使用 [新增...] 動作,將伺服器變數新增HTTP_COOKIE,並將ORIGINAL_URI新增至 [允許的伺服器變數] 清單:

[新增伺服器變數] 對話方塊的螢幕擷取畫面,其中已輸入原始底線 U R I 作為伺服器變數名稱。

更新 [允許的伺服器變數] 清單之後,按一下 [返回規則] 動作返回規則清單檢視。

定義重寫對應

下一個步驟是定義重寫對應,將用來對應 URL 部分,代表語言到重寫規則將重寫規則儲存到 HTTP Cookie 標頭中的地區設定識別碼。

選取 [檢視重寫地圖...][動作] 窗格中的動作:

U R L 重寫畫面的螢幕擷取畫面,其中焦點位於 [動作] 窗格中的 [檢視重寫地圖] 選項。

按一下 [新增重寫對應...]並將地圖的名稱指定為 「Languages」:

[新增重寫對應] 對話方塊的螢幕擷取畫面,其中已輸入語言作為重寫地圖名稱。

此對應會定義 URL 元件之間的對應,此元件代表語言,以及設定 HTTP 要求 Cookie 時要使用的地區設定識別碼。 按一下 [編輯地圖設定...]動作,指定要在找不到對應時使用的預設值。 輸入 「en_US」 作為預設值:

[編輯重寫對應] 對話方塊的螢幕擷取畫面,其中顯示 E N 底線 U S 作為地圖中找不到索引鍵時要使用的預設值。

關閉對話方塊,然後使用 [新增對應專案...]要新增下列對應的動作:

原始值: 新值:
fr-fr fr_FR
de-de de_DE
ru-ru ru_RU

定義重寫規則

最後,您將建立重寫規則,以使用稍早定義的重寫對應來設定伺服器變數。

按一下 [新增規則...] 來啟動 [編輯規則] 對話方塊主要功能檢視中的動作,並從 [輸入規則] 類別中選取 [空白規則]。 輸入規則組態,如下所示:

[編輯輸入規則] 畫面的螢幕擷取畫面,其中顯示 [名稱]、[比對 U R L]、[條件]、[伺服器變數] 和 [動作] 區段。

  • 規則名稱:「set server variables

  • 要求的 URL:「符合模式

  • 使用:「正則運算式

  • 模式:「^ ([a-z] {2} -[a-z] {2}) / (.*)

  • 條件:

    • 輸入:「{Languages:{R:1}}」
    • 類型:「符合模式」
    • 模式:「 (.+) 」
  • 動作:

    • 類型:「重寫」
    • 重寫 URL:「{R:2}」

規則的模式會比對包含語言區段的任何 URL 路徑 (, http://www.contoso.com/de-de/default.aspx 例如,) 。 它也會擷取規則回溯參考中 URL 路徑的語言區段和其餘部分,以便稍後在規則中重複使用。 規則條件會使用先前擷取的語言區段做為查閱索引鍵,傳遞至重寫對應 「Languages」。 對應查閱的結果會儲存在條件後參考中。 規則動作會重寫 URL,以不包含語言區段。

展開 [伺服器變數...]並指定要用於設定伺服器變數的值:

[伺服器變數] 對話方塊的螢幕擷取畫面,其中 H T T P 底線 COOKIE 和 [名稱] 欄位中輸入的原始底線 U R L。

  • 名稱:HTTP_COOKIE,值:Language={C:1}
  • 名稱:ORIGINAL_URI、值:HTTP://{HTTP_HOST}{REQUEST_URI}

HTTP Cookie 是使用條件回溯參考來設定,其中包含從「語言」重寫對應取得的地區設定識別碼。 ORIGINAL_URI伺服器變數的值是使用 {HTTP_HOST} 和 {REQUEST_URI} 伺服器變數所建置。

按一下 [確定] 關閉對話方塊,然後按一下右側 [動作] 窗格中的 [套用] 以儲存規則。

測試規則

若要測試規則是否正確設定 Cookie 和伺服器變數,請開啟網頁瀏覽器並要求下列 URL:

http://localhost/fr-fr/language.aspx

U R L 重寫模組 v 2 測試網頁的螢幕擷取畫面,其中著重于 U R L 列,語言 Cookie 會設定為 F R 底線 F R。

您應該會看到重寫規則已根據要求的 URL 設定「語言」Cookie。 此外,已透過 「ORIGINAL_URI」 伺服器變數存取 ASP.NET 網頁的原始 URL 字串。