共用方式為


建立 URL Rewrite Module 的重寫規則

作者: Ruslan Yakushev

URL 重寫模組是 IIS 的延伸模組,可作為獨立 IIS 伺服器的下載,也會預先安裝在 Windows Azure 網站的任何網站上, (WAWS) 可供 您使用。 本逐步解說將引導您建立及測試 URL 重寫模組的一組重寫規則。

必要條件

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

  1. 已啟用 ASP.NET 角色服務的 IIS 7 或更新版本。
  2. 已安裝 URL 重寫模組。 如需詳細資訊,請參閱 使用 URL 重寫模組

設定測試網頁

為了示範 URL 重寫模組的運作方式,我們將使用簡單的測試 ASP.NET 網頁。 此頁面會讀取 Web 服務器變數,並在瀏覽器中輸出其值。

複製下列 ASP.NET 程式碼,並將其放在名為article.aspx的檔案中 %SystemDrive%\inetpub\wwwroot\ 資料夾中:

<%@ 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 Test</title>
</head>
<body>
      <h1>URL Rewrite Module Test Page</h1>
      <table>
            <tr>
                  <th>Server Variable</th>
                  <th>Value</th>
            </tr>
            <tr>
                  <td>Original URL: </td>
                  <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
            </tr>
            <tr>
                  <td>Final URL: </td>
                  <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
      </table>
</body>
</html>

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

建立重寫規則

我們將建立簡單的重寫規則,以使用下列格式重寫 URL:

http://localhost/article/342/some-article-title
變更為:
http://localhost/article.aspx?id=342&title=some-article-title.

我們將使用 IIS 管理員中的 URL 重寫 UI 來建立重寫規則。 若要這樣做,請遵循下列步驟:

  1. 移至 [IIS 管理員]。
  2. 選取 [預設網站]。
  3. 在 [功能檢視] 中,按一下 [ URL 重寫]。
    顯示 [預設網站首頁] 窗格的螢幕擷取畫面。已選取 U R L 重寫。
  4. 在右側的 [ 動作 ] 窗格中,按一下 [ 新增規則...
    顯示 [U R L 重寫] 窗格的螢幕擷取畫面。
  5. 在 [ 新增規則 ] 對話方塊中,選取 [ 空白規則 ],然後按一下 [ 確定]。
    顯示 [新增規則] 對話方塊的螢幕擷取畫面。

現在您必須定義實際的重寫規則。 在 URL 重寫模組中,重寫規則是藉由指定四個必要的資訊片段來定義:

  • 規則的名稱。
  • 用於比對 URL 字串的模式。
  • 選擇性的一組條件。
  • 比對模式以及所有條件檢查是否成功時要執行的動作。

命名規則

在 [ 名稱] 文字方塊中,輸入可唯一識別規則的名稱,例如:「重寫為 article.aspx」。

顯示 [編輯輸入規則] 窗格的螢幕擷取畫面。

定義模式

在 [ 模式] 文字方塊中,輸入下列字串:

^article/([0-9]+)/([_0-9a-z-]+)

此字串是正則運算式,指定模式符合符合下列條件的任何 URL 字串:

  1. 以字元序列 「article/」 開頭。
  2. 在第一個 「/」 之後包含一或多個數值字元。
  3. 包含第二個 「/」 之後的一或多個英數位元或 「_」 或 「-」。

請注意,正則運算式的某些部分位於括弧內。 這些括弧會建立擷取群組,稍後可以使用反向參考在規則中參考。

定義動作

由於我們所建立的規則應該重寫 URL,請選擇 [動作] 群組方塊中所列的[重寫] 動作類型。 在 [ 重寫 URL: ] 文字方塊中,輸入下列字串:

article.aspx?id={R:1}&title={R:2}

此字串會指定要重寫輸入 URL 的新值。 請注意,針對我們使用 {R:1} 和 {R:2} 的查詢字串參數值,這些值是使用括弧在規則模式中定義的擷取群組反向參考。

保留所有其他設定的預設值。 [ 編輯輸入規則] 屬性頁看起來應該像下列頁面:

顯示 [編輯輸入規則] 屬性頁的螢幕擷取畫面。

按一下右側的 [ 套用 ] 以儲存規則。

在組態檔中檢視重寫規則

重寫規則會儲存在ApplicationHost.config檔案或Web.config檔案中。 若要檢查我們剛才建立的規則組態,請開啟位於 %SystemDrive%\inetpub\wwwroot 中的Web.config檔案。 在此檔案中,您應該會看到 <rewrite> 包含此規則定義的區段:

<rewrite>
  <rules>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>

上述語法也適用于在 Windows Azure 網站中的 Web.config 中設定 URL 重寫 , (WAWS)

測試重寫規則

若要測試規則是否正確重寫 URL,請開啟網頁瀏覽器並要求下列 URL:

http://localhost/article/234/some-title

您應該會看到網頁伺服器上的重寫規則已將原始 URL 變更為 Article.aspx,並傳遞 「234」 和 「some-title」 作為查詢字串參數的值。

顯示 Internet Explorer 中 U R L 重寫模組測試頁面的螢幕擷取畫面。

建立重新導向規則

現在我們將建立重新導向規則,以下列格式重新導向所有 URL:

http://localhost/blog/some-other-title/543
為下列格式:
http://localhost/article/543/some-other-title

重新導向規則可讓多個 URL 指向單一網頁。

若要這樣做,請在 IIS 管理員中開啟 URL 重寫功能檢視 UI。 按一下 [新增規則 () ...],然後再次選取 [空白規則 ] 範本。

在 [ 編輯規則] 頁面中,輸入下列專案:

  • 名稱: 從部落格 重新導向 (這是 rule.) 的唯一名稱
  • 模式: ^blog/ ([_0-9a-z-]+) / ([0-9]+) (此模式會比對開頭為 「blog」 的 URL 字串,並將 URL 的第二和第三個區段擷取回回參考。)
  • 動作: 重新 導向 (重新導向動作會導致重新導向回應傳回瀏覽器。)
  • 重新導向 URL: 文章/{R:2}/{R:1} (此替代字串將作為重新導向 URL;請注意,它會使用反向參考來保留及重新排列模式比對期間擷取的原始 URL 片段。)

輸入名稱、模式和動作,如下所示:

顯示 [編輯輸入規則] 窗格的螢幕擷取畫面。名稱、模式和動作有新的專案。

輸入重新導向 URL,如下所示:

顯示 [編輯輸入規則] 窗格的螢幕擷取畫面。在 [動作類型] 底下,已選取 [重新導向],並輸入 [重新導向 U R L]。

保留所有其他設定的預設值。 按一下右側的 [ 套用 ] 以儲存規則。

測試重新導向規則

若要測試規則重新導向要求是否正確,請開啟網頁瀏覽器並要求下列 URL:

http://localhost/blog/some-other-title/323

您應該會看到瀏覽器因為重新導向規則執行而重新導向至 http://localhost/article/323/some-other-title ,然後根據您稍早建立的重寫規則重寫要求。

顯示 U R L 重寫模組測試頁面上 Internet Explorer 的螢幕擷取畫面。

建立存取區塊規則

我們將建立的第三個規則是用來封鎖這些要求未設定主機標頭時,封鎖對網站提出的所有要求。 當您想要防止對伺服器的 IP 位址發出 HTTP 要求而非使用主機名稱來進行的駭客入侵嘗試時,這種類型的規則很有用。

我們將建立此規則,而不使用 IIS 管理員。 在本文早期用於 article.aspx 測試檔案的 資料夾中,開啟Web.config %SystemDrive%\inetpub\wwwroot\ 檔案。 找出 <rewrite> 區段。 將下列規則插入 < 規則 > 集合中,使其是集合中的第一個規則:

<rule name="Fail bad requests">
  <match url=".*"/>
  <conditions>
    <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
  </conditions>
  <action type="AbortRequest" />
</rule>

<rewrite> 段看起來應該像下列程式碼:

<rewrite>
  <rules>
    <rule name="Fail bad requests">
      <match url=".*"/>
      <conditions>
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="AbortRequest" />
    </rule>
    <rule name="Redirect from blog">
      <match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
      <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
    </rule>
    <rule name="Rewrite to article.aspx">
      <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
      <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
    </rule>
  </rules>
</rewrite>

讓我們分析規則以瞭解其用途。

<match url=".*"/>

上述元素指出規則會符合任何 URL 字串。

<add input="{HTTP_HOST}" pattern="localhost" negate="true" />

上述元素會將條件新增至規則,藉由讀取伺服器變數HTTP_HOST來擷取主機標頭值、根據模式 「localhost」 比對它,然後否定比對的結果。 換句話說,條件會驗證主機標頭不符合 「localhost」。

<action type="AbortRequest" />

上述元素會指示 URL 重寫模組結束 HTTP 要求。

測試存取區塊規則

若要測試此規則,請開啟網頁瀏覽器,並向 http://127.0.0.1/article/234/some-title 提出要求。 您應該會看到的瀏覽器不會收到來自伺服器的任何回應。 不過,如果您要求 http://localhost/article/234/some-title ,Web 服務器將會成功回應。

失敗的顯示方式如下:

顯示瀏覽器的螢幕擷取畫面,指出無法顯示此頁面。

成功的顯示會顯示如下:

顯示瀏覽器中 U R L 重寫模組測試頁面的螢幕擷取畫面。

總結

在本逐步解說中,您已瞭解如何使用 IIS 管理員或手動編輯Web.config檔案來設定 URL 重寫規則。 本逐步解說中建立的規則示範了 URL 重寫模組的一些重要功能,例如正則運算式支援,以及使用 HTTP 標頭和伺服器變數來進行重寫決策的能力。