建立 URL 重寫模組的輸出規則
本檔的這一節適用於 IIS 7 的 URL 重寫模組 2.0 版。
本逐步解說將引導您建立及測試 URL 重寫模組 2.0 的輸出重寫規則。
必要條件
本逐步解說需要下列必要條件:
- 已啟用 ASP.NET 角色服務的 IIS 7 或更新版本;
- 已安裝 URL 重寫模組 2.0 RC 版本。
設定測試網頁
為了示範 URL 重寫模組 2 的運作方式,您將使用簡單的 ASP.NET 頁面。 此頁面會讀取 Web 伺服器變數,並在瀏覽器中顯示其值。 它也會使用伺服器變數建構超連結,然後將該連結放入回應 HTML。
建立測試頁面
在下列資料夾中建立名為 article.aspx 的檔案:
%SystemDrive%\inetpub\wwwroot\
複製下列 ASP.NET 標記,將它貼到檔案中並儲存盤案:
<%@ 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</title> </head> <body> <h1>URL Rewrite Module v2 Test Page</h1> <h2>Inbound URL Rewriting</h2> <table> <tr> <th>Server Variable</th> <th>Value</th> </tr> <tr> <td>Original URL: </td> <td><%= Request.ServerVariables["UNENCODED_URL"] %></td> </tr> <tr> <td>Final URL: </td> <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td> </tr> </table> <h2>Outbound URL Rewriting</h2> <a href="<%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %>">Here</a> is the link to this article. </body> </html>
開啟網頁瀏覽器並要求下列 URL,以確保頁面正確轉譯:
http://localhost/article.aspx
新增輸入重寫規則
下一個步驟是新增規則,以重寫具有下列格式的 URL:
http://localhost/article/342/some-article-title
這些 URL 將會重寫成具有如下的格式:
http://localhost/article.aspx?id=342&title=some-article-title
若要新增輸入重寫規則:
開啟位於下列位置 的web.config 檔案:
%SystemDrive%\inetpub\wwwroot\
在 /configuration/system.webServer 元素下,新增下列內容,然後儲存盤案:
<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>
如需建立輸入重寫規則的詳細資訊,請參閱 建立URL重寫模組的重寫規則。
測試輸入重寫規則
您現在可以測試輸入重寫規則是否如設計般運作。
若要測試輸入重寫規則:
開啟網頁瀏覽器並要求下列 URL:
http://localhost/article/342/some-article-title
如果重寫規則正常運作,您會收到如下所示的伺服器回應:
由於輸入規則,您可以使用簡單且方便使用的 URL 結構來存取此網頁。 不過,如果使用者按兩下 HTML 頁面中的超連結,網頁瀏覽器將會使用具有查詢字串參數的 URL。 這不理想,因為下列幾個原因:
- 網站訪客會看到您想要使用 URL 重寫規則隱藏的內部 URL 結構。
- 多個 URL 會存取相同的頁面,這不適合用於搜尋引擎優化。
修正此問題的最簡單方式是修改 HTML 頁面以使用簡單鏈接結構。 不過,在許多情況下,不可能這樣做。 例如,如果您已經有複雜的舊版 Web 應用程式或您無法修改的 Web 應用程式,則修正應用程式中所有 URL 連結的工作可能非常耗時,或完全不可行。
這是輸出 URL 重寫可協助的時機。 輸出 URL 重寫可以在應用程式所產生的回應中,即時修正連結。
建立輸出重寫規則
您現在將會建立輸出重寫規則,以變更 HTML 回應中的 URL。 此規則會變更具有下列格式的 URL:
http://localhost/article.aspx?id=342&title=some-article-title
這些 URL 將會重寫為下列內容:
http://localhost/article/342/some-article-title
您將使用 IIS 管理員中的 URL 重寫使用者介面來建立輸出規則。
若要建立輸出規則:
- 開啟 IIS 管理員
- 選取 [預設網站]
- 在 [功能檢視] 中,選取 [URL 重寫]
- 在右側的 [動作] 窗格中,按兩下 [新增規則...]。 在 [新增規則] 對話框中,選取 [輸出規則] 類別下的 [空白規則],然後按兩下 [確定]。
現在您必須定義實際的輸出規則。 在 URL 重寫模組 2.0 中,會藉由指定下列資訊來定義輸出重寫規則:
- 規則的名稱。
- 選擇性前置條件,可控制此規則是否應該套用至回應。
- 用於比對回應中字串的模式。
- 一組選擇性的條件。
- 符合模式且所有條件檢查都成功時所要執行的動作。
命名規則
在 [名稱] 文本框中,輸入將唯一識別規則的名稱,例如:「重寫以清除 URL」。
定義前置條件
前置條件是用來評估是否應在回應上執行輸出規則評估。 例如,如果修改 HTML 內容的規則,只有內容類型標頭設定為 「text/html」 的 HTTP 回應應該針對此規則進行評估。 輸出規則評估和內容重寫是CPU密集作業,可能會對 Web 應用程式的效能造成負面影響。 因此,使用前置條件來縮小套用輸出規則時的案例範圍。
因為您建立的規則應該只套用至 HTML 回應,所以您將定義前置條件,以檢查 HTTP 回應標頭 內容類型 是否等於 「text/html」。。
若要定義前置條件:
在 [先決條件] 清單中,選取 [<建立新的預先條件>]。
這會帶您前往 [條件前編輯器] 對話框,您需要在其中定義前置條件。 指定前置條件設定,如下所示:
名稱:“IsHTML”
使用:“正則表達式”
按兩下 [新增] 以顯示 [新增條件] 對話框。 在這裡對話框中,指定:
條件輸入:“{RESPONSE_CONTENT_TYPE}”
檢查輸入字串是否為「符合模式」
模式:“^text/html”
單擊 [確定] 以儲存前置條件,並返回 [編輯規則] 頁面。
定義相符的範圍
輸出重寫規則可以在 HTTP 標頭的內容或回應本文內容上運作。 此規則必須取代響應內容中的連結,因此在 [比對範圍] 下拉式清單中,選擇 [回應]。
定義標籤篩選
卷標篩選條件是用來限定特定 HTML 元素的模式比對範圍,而不是評估規則模式的整個回應。 模式比對是非常耗 CPU 的作業,而且如果針對模式評估整個回應,它可能會大幅降低 Web 應用程式回應時間。 卷標篩選可讓您指定模式比對只能在特定 HTML 標籤的內容內套用,因而大幅減少必須針對正則表達式模式進行評估的數據量。
若要定義標籤篩選,請展開下拉式清單「比對下列內容 」,然後選取並核取複選框「A (href 屬性) 」。
這會設定規則,將模式只套用至超連結 的 href 屬性值,如下列範例所示:
<a href="this string will be used for pattern matching">Some link</a>
定義模式
在 [模式] 文字框中,輸入下列字串:
^/article\.aspx\?id=([0-9]+)(?:&|&)title=([_0-9a-z-]+)$
此字串是正規表示式,指定模式會符合符合下列條件的任何URL字串:
- 開頭為字元 “/article.aspx?”。
- 包含具有數值的第一個查詢字串參數。
- 包含具有英數位元值的第二個查詢字串參數。
請注意,正則表達式的某些部分位於括弧內。 這些括弧會建立擷取群組,稍後可以使用反向參考在規則中參考。 此外,在大部分情況下,「&」 符號是在響應中編碼的 HTML,因此正則表示式模式必須考慮該符號。
定義動作
選擇 [動作] 群組框中的 [重寫] 動作類型。 在 [值] 文字框中,輸入下列字串:
/article/{R:1}/{R:2}
此字串會指定要重寫連結位址的新值。 請注意,針對查詢字串參數的值,表達式會使用 {R:1} 和 {R:2},這是使用括號在規則模式中定義的擷取群組反向參考。
保留所有其他設定的預設值。 [編輯規則] 屬性頁看起來會像下列頁面:
按下右側的 [套用] 動作來儲存規則。
在組態檔中檢視重寫規則
重寫規則會儲存在 aplicationHost.config 檔案或 web.config 檔案中。 若要檢查您剛才建立的規則組態,請開啟位於 的 web.config 檔案
%SystemDrive%\inetput\wwwroot\
在此檔案中,您會看到 <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>
<outboundRules>
<rule name="Rewrite to clean URL" preCondition="IsHTML">
<match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&|&amp;)title=([_0-9a-z-]+)$" />
<action type="Rewrite" value="/article/{R:1}/{R:2}" />
</rule>
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
測試規則
您現在可以測試規則是否正確重寫 URL。 開啟網頁瀏覽器並要求下列 URL:
http://localhost/article/342/some-article-title
您應該會看到輸出重寫規則已變更 HTML 回應中的連結:
現在,如果網站訪客單擊此連結,則會使用全新的URL格式,而且不會顯示此頁面所使用的內部URL表示法。
摘要
在本逐步解說中,您已瞭解如何使用 IIS 管理員或手動編輯 web.config 檔案,在 URL 重寫模組 2.0 中設定輸出重寫規則。 本逐步解說中建立的規則示範 URL 重寫模組 2.0 的一些重要功能,例如輸出重寫、前置條件和標記篩選。