建立 URL Rewrite Module 的重寫規則
作者: Ruslan Yakushev
URL 重寫模組是 IIS 的延伸模組,可作為獨立 IIS 伺服器的下載,也會預先安裝在 Windows Azure 網站的任何網站上, (WAWS) 可供 您使用。 本逐步解說將引導您建立及測試 URL 重寫模組的一組重寫規則。
必要條件
本逐步解說需要下列必要條件:
- 已啟用 ASP.NET 角色服務的 IIS 7 或更新版本。
- 已安裝 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 來建立重寫規則。 若要這樣做,請遵循下列步驟:
- 移至 [IIS 管理員]。
- 選取 [預設網站]。
- 在 [功能檢視] 中,按一下 [ URL 重寫]。
- 在右側的 [ 動作 ] 窗格中,按一下 [ 新增規則...
- 在 [ 新增規則 ] 對話方塊中,選取 [ 空白規則 ],然後按一下 [ 確定]。
現在您必須定義實際的重寫規則。 在 URL 重寫模組中,重寫規則是藉由指定四個必要的資訊片段來定義:
- 規則的名稱。
- 用於比對 URL 字串的模式。
- 選擇性的一組條件。
- 比對模式以及所有條件檢查是否成功時要執行的動作。
命名規則
在 [ 名稱] 文字方塊中,輸入可唯一識別規則的名稱,例如:「重寫為 article.aspx」。
定義模式
在 [ 模式] 文字方塊中,輸入下列字串:
^article/([0-9]+)/([_0-9a-z-]+)
此字串是正則運算式,指定模式符合符合下列條件的任何 URL 字串:
- 以字元序列 「article/」 開頭。
- 在第一個 「/」 之後包含一或多個數值字元。
- 包含第二個 「/」 之後的一或多個英數位元或 「_」 或 「-」。
請注意,正則運算式的某些部分位於括弧內。 這些括弧會建立擷取群組,稍後可以使用反向參考在規則中參考。
定義動作
由於我們所建立的規則應該重寫 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}&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」 作為查詢字串參數的值。
建立重新導向規則
現在我們將建立重新導向規則,以下列格式重新導向所有 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,如下所示:
保留所有其他設定的預設值。 按一下右側的 [ 套用 ] 以儲存規則。
測試重新導向規則
若要測試規則重新導向要求是否正確,請開啟網頁瀏覽器並要求下列 URL:
http://localhost/blog/some-other-title/323
您應該會看到瀏覽器因為重新導向規則執行而重新導向至 http://localhost/article/323/some-other-title
,然後根據您稍早建立的重寫規則重寫要求。
建立存取區塊規則
我們將建立的第三個規則是用來封鎖這些要求未設定主機標頭時,封鎖對網站提出的所有要求。 當您想要防止對伺服器的 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}&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 服務器將會成功回應。
失敗的顯示方式如下:
成功的顯示會顯示如下:
總結
在本逐步解說中,您已瞭解如何使用 IIS 管理員或手動編輯Web.config檔案來設定 URL 重寫規則。 本逐步解說中建立的規則示範了 URL 重寫模組的一些重要功能,例如正則運算式支援,以及使用 HTTP 標頭和伺服器變數來進行重寫決策的能力。