在 URL 重寫模組中使用重寫對應
本逐步解說將介紹在URL重寫模組中重寫地圖的概念,並引導您建立使用重寫地圖的重寫規則。 在本逐步解說中,您將建立兩個重寫對應:一個重寫對應將由執行 URL 重寫的規則使用,另一個重寫對應將由執行重新導向至不同網域的規則使用。
背景
重寫對應是任意的名稱和值組集合,可在重寫規則中用來在重寫期間產生替代 URL。 當您有一組大量的重寫規則,而且所有這些規則都使用靜態字串 (,也就是沒有使用模式比對) 時,重寫對應特別有用。 在這些情況下,您可以在輸入 URL 與替代 URL 之間,將所有對應放在重寫對應中,而不是定義一組大量的簡單重寫規則。 然後,若要根據輸入 URL 查閱替代 URL,您將有一個參考此重寫對應的重寫規則。
必要條件
本逐步解說需要下列必要條件:
- 已啟用 ASP.NET 角色服務的 IIS 7.0 或更新版本
- 已安裝 URL 重寫 Go Live 版本
設定測試網頁
為了示範重寫地圖功能,我們將使用簡單的測試 asp.net 頁面。 此頁面會讀取網頁伺服器變數,並在瀏覽器中輸出其值。
複製下列 ASP.NET 程式代碼,並將其放在 %SystemDrive%\inetpub\wwwroot\
名為 article.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 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 與重寫 URL 之間的一組靜態對應來執行 URL 重寫。 若要建立重寫對應,請遵循下列步驟:
移至 IIS 管理員
選取 [預設網站]
在右側網站的 [動作] 窗格中,按兩下 [新增重寫對應...]然後輸入重寫對應的名稱作為 「StaticRewrites」:
在新建立的重寫對應頁面上,按下右側的 [動作] 窗格,按兩下 [新增對應專案...]然後針對 “Original value:” 和 “New value:” 文本框輸入 “/article.aspx?id=1&title=some-title”。 原始值會指定我們想要重寫的來源 URL 路徑;新值會指定我們想要重寫的 URL 路徑。
重複步驟 6,將下列對應新增至重寫對應:
原始值: 新值: /some-title /article.aspx?id=1&title=some-title /post/some-title.html /article.aspx?id=1&title=some-title
現在,如果您使用默認網站,請開啟網站的 web.config 檔案 (,您可以在) 找到 %SystemDrive%\inetpub\wwwroot
web.config。 您應該會看到下列章節:
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRewrites" defaultValue="">
<add key="/article1" value="/article.aspx?id=1&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&title=some-title" />
</rewriteMap>
</rewriteMaps>
</rewrite>
這個重寫對應稱為 「StaticRewrites」,將用來重寫在重寫對應中定義為索引鍵的傳入 URL (,) 重寫對應 (定義為值) 。 defaultValue 屬性會指定要在對應中未定義傳入 URL 時要使用的值。 在此情況下,將會傳回空字串。
請注意,索引鍵及其值關聯中沒有明顯的常見模式。 這表示無法使用正則表示式或通配符來定義 URL 轉換邏輯。 此外,這表示如果我們未使用重寫對應,就必須建立三個重寫規則。 透過重寫對應,我們只能建立一個重寫規則。 下一節說明如何建立使用此重寫對應的重寫規則。
從重寫規則參考重寫對應
若要建立使用重寫地圖的重寫規則,請將下列 XML 程式代碼複製並貼到 <rewrite>
網站的 web.config 檔案區段中:
<rules>
<rule name="Rewrite Rule">
<match url=".*" />
<conditions>
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Rewrite" url="{C:1}" />
</rule>
</rules>
讓我們逐一查看每個規則元素,以瞭解其用途:
<match url=".*" />
- 此元素會指示 URL 重寫模組使用正則表示式特殊字元 “, 比對任何傳入 URL (。)
<add input="{StaticRewrites:{REQUEST\_URI}}" pattern="(.+)">
- 此條件檢查是從重寫地圖 StaticRewrites 傳回的值不是空字串。 若要執行這項檢查,伺服器變數的值REQUEST_URI會當做參數傳遞至重寫對應。 如果重寫對應包含索引鍵的專案,該專案與REQUEST_URI相同,則會傳回對應至該索引鍵的值。 正則表達式模式只會比對非空白字串,因此如果從對應傳回空字串,則條件會評估為 false,因此不會執行重寫。 如果傳回非空白字串,則會在反向參考中擷取該字串,因為模式中使用的括號。
<action type="Rewrite" url="{C:1}" />
- 這個專案指定 URL 重寫模組需要重新撰寫目前的 URL 字串,並使用從重寫對應中擷取的新 URL 字串。 請注意,url 屬性會參考條件後參考 {C:1},當條件中的模式相符時已設定。
測試重寫規則
若要測試使用 「StaticRewrites」 地圖的重寫規則,請開啟網頁瀏覽器並要求下列任何 URL:
http://localhost/article1
http://localhost/some-title
http://localhost/post/some-title.html
上述任何一個 URL 都應該根據重寫對應中定義的對應來重寫 URL。 您的結果看起來應該像下列頁面:
使用重寫對應進行重新導向
現在,我們將建立另一個重寫對應,用來定義來源 URL 與重新導向 URL 之間的靜態對應。 若要建立重寫對應,請遵循「建立地圖以進行重寫」一節中所述的相同步驟,但將重寫對應命名為 「StaticRedirects」,並使用下列值進行對應專案:
原始值: | 新值: |
---|---|
/old-article.aspx?id=1 | /article.aspx?id=1 |
/posts/default.aspx?id=1 | /article.aspx?id=1 |
/old-title.html | /article.aspx?id=1 |
您網站的 web.config 檔案現在應該包含這兩個重寫對應:
<rewriteMaps>
<rewriteMap name="StaticRewrites">
<add key="/article1" value="/article.aspx?id=1&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&title=some-title" />
</rewriteMap>
<rewriteMap name="StaticRedirects">
<add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
<add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
<add key="/old-title.html" value="/article.aspx?id=1" />
</rewriteMap>
</rewriteMaps>
若要建立使用 StaticRedirects 重寫對應的規則,請將下列規則定義複製並貼到網站的 web.config 檔案中:
<rules>
<rule name="Redirect Rule" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{StaticRedirects:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
</rule>
</rules>
同樣地,讓我們逐一查看每個規則元素,以瞭解其用途:
<match url=".*" />
- 此元素會指示 URL 重寫模組使用正則表示式特殊字元 “, 比對任何傳入 URL (。)
<add input="{StaticRedirects:{REQUEST\_URI}}" pattern="(.+)">
- 此條件檢查是從重寫對應 StaticRedirects 傳回的值不是空字串。 若要執行這項檢查,伺服器變數的值REQUEST_URI會當做參數傳遞至重寫對應。 如果重寫對應包含索引鍵的專案,該專案與REQUEST_URI相同,則會傳回對應至該索引鍵的值。 正則表達式模式只會比對非空白字串,因此如果從對應傳回空字串,則條件會評估為 false,因此不會執行重寫。 如果傳回非空白字串,則會在反向參考中擷取該字串,因為模式中使用的括號。
<action type="Redirect" url="http://localhost{C:1}" appendQueryString="False" redirectType="Permanent" />
- 此元素指定 URL 重寫模組必須將 Web 用戶端重新導向至新的 URL,此 URL 是由串連新功能變數名稱所建構的新 URL (,在此案例中,它是相同的網域,為了簡單起見,) 以及 StaticRedirects 對應傳回的重新導向 URL 路徑。
測試重新導向的規則
若要測試使用 「StaticRedirects」 地圖的重寫規則,請開啟網頁瀏覽器並要求下列任何 URL:
http://localhost/old-article
http://localhost/posts/default.aspx?id=1
http://localhost/old-title.html
上述任何一個 URL 都應該將瀏覽器重新導向至 http://localhost/article.aspx?id=1
。
針對查詢字串參數使用重寫對應
重寫地圖的使用方式不限於上述範例。 重寫對應是索引鍵/值組的泛型集合,可用於重寫規則中的任何位置。 為了說明這一點,讓我們建立可用於操作查詢字串參數的重寫對應。
依照「建立地圖以進行重寫」一節中所述的相同步驟,建立第三個重寫對應。 將重寫對應命名為 「IDtoTitleMap」,並針對對應專案使用下列值:
原始值: | 新值: |
---|---|
1 | some-title-1 |
2 | some-title-2 |
3 | some-title-3 |
網站 web.config 檔案現在應該包含這兩個重寫對應:
<rewriteMaps>
<rewriteMap name="StaticRewrites">
<add key="/article1" value="/article.aspx?id=1&title=some-title" />
<add key="/some-title" value="/article.aspx?id=1&title=some-title" />
<add key="/post/some-title.html" value="/article.aspx?id=1&title=some-title" />
</rewriteMap>
<rewriteMap name="StaticRedirects">
<add key="/old-article.aspx?id=1" value="/article.aspx?id=1" />
<add key="/posts/default.aspx?id=1" value="/article.aspx?id=1" />
<add key="/old-title.html" value="/article.aspx?id=1" />
</rewriteMap>
<rewriteMap name="IDtoTitleMap">
<add key="1" value="some-title-1" />
<add key="2" value="some-title-2" />
<add key="3" value="some-title-3" />
</rewriteMap>
</rewriteMaps>
若要建立使用 IDtoTitleMap 重寫對應的規則,請將下列規則定義複製並貼到網站的 web.config 檔案中:
<rules>
<rule name="Query String Rule" stopProcessing="true">
<match url="^article\.aspx$" />
<conditions>
<add input="{QUERY_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False"
redirectType="Permanent" />
</rule>
</rules>
讓我們逐一查看每個規則元素,以瞭解其用途:
<match url="^article\.aspx$" />
- 此元素會指示 URL 重寫模組在要求 article.aspx 檔案時執行規則。
<add input="{QUERY\_STRING}" pattern="(?:^|&)id=([0-9]+)(?:&|$)" />
- 此條件會檢查查詢字串是否包含具有數值的參數 識別碼 。 實際值會在條件回傳參考中擷取。 請注意,即使查詢字串上有其他參數,此模式仍可運作。
<add input="{IDtoTitleMap:{C:1}}" pattern="(.+)" />
- 此條件會檢查重寫對應 IDtoTitleMap 傳回的值是否不是空字串。 條件會使用上一個條件模式中的反向參考作為重寫對應的輸入。
<action type="Redirect" url="article.aspx?title={C:1}" appendQueryString="False" redirectType="Permanent" />
- 此元素指定 URL 重寫模組需要將 Web 用戶端重新導向回 article.aspx 檔案,但有不同的查詢字串參數 標題,其值是在重寫對應中查閱。
測試查詢字串的規則
若要測試使用 「IDtoTitleMap」 對應的重寫規則,請開啟網頁瀏覽器並要求下列任何 URL:
http://localhost/article.aspx?id=1
. 這會重新導向至 http://localhost/article.aspx?title=some-title-1. http://localhost/article.aspx?someparam=somevalue&id=2
。 這會重新導向至 http://localhost/article.aspx?title=some-title-2
摘要
在本逐步解說中,您已瞭解如何使用重寫對應來定義重寫和重新導向規則的 URL 對應。 此外,您已瞭解如何使用重寫對應來管理查詢字串參數。
重寫對應可讓您在重寫和重新導向 URL 為靜態時減少重寫規則的數目,而且無法使用任何模式比對技術來表示重寫邏輯。