共用方式為


在 URL 重寫模組中使用重寫對應

作者 :Ruslan Yakushev

本逐步解說將介紹在URL重寫模組中重寫地圖的概念,並引導您建立使用重寫地圖的重寫規則。 在本逐步解說中,您將建立兩個重寫對應:一個重寫對應將由執行 URL 重寫的規則使用,另一個重寫對應將由執行重新導向至不同網域的規則使用。

背景

重寫對應是任意的名稱和值組集合,可在重寫規則中用來在重寫期間產生替代 URL。 當您有一組大量的重寫規則,而且所有這些規則都使用靜態字串 (,也就是沒有使用模式比對) 時,重寫對應特別有用。 在這些情況下,您可以在輸入 URL 與替代 URL 之間,將所有對應放在重寫對應中,而不是定義一組大量的簡單重寫規則。 然後,若要根據輸入 URL 查閱替代 URL,您將有一個參考此重寫對應的重寫規則。

必要條件

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

  1. 已啟用 ASP.NET 角色服務的 IIS 7.0 或更新版本
  2. 已安裝 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 重寫。 若要建立重寫對應,請遵循下列步驟:

  1. 移至 IIS 管理員

  2. 選取 [預設網站]

  3. 在 [功能檢視] 中,按兩下 [URL 重寫]
    顯示功能檢視中 U R L 重寫的螢幕快照。

  4. 在右側的 [動作] 窗格中,按兩下 [檢視重寫地圖...]:
    顯示檢視重寫地圖的螢幕快照...

  5. 在右側網站的 [動作] 窗格中,按兩下 [新增重寫對應...]然後輸入重寫對應的名稱作為 「StaticRewrites」:
    顯示 [重寫對應名稱] 方塊的螢幕快照。

  6. 在新建立的重寫對應頁面上,按下右側的 [動作] 窗格,按兩下 [新增對應專案...]然後針對 “Original value:” 和 “New value:” 文本框輸入 “/article.aspx?id=1&title=some-title”。 原始值會指定我們想要重寫的來源 URL 路徑;新值會指定我們想要重寫的 URL 路徑。
    顯示 [原始值] 和 [新增值] 方塊的螢幕快照。

  7. 重複步驟 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&amp;title=some-title" />
            <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
            <add key="/post/some-title.html" value="/article.aspx?id=1&amp;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&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;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&amp;title=some-title" />
        <add key="/some-title" value="/article.aspx?id=1&amp;title=some-title" />
        <add key="/post/some-title.html" value="/article.aspx?id=1&amp;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="(?:^|&amp;)id=([0-9]+)(?:&amp;|$)" /> - 此條件會檢查查詢字串是否包含具有數值的參數 識別碼 。 實際值會在條件回傳參考中擷取。 請注意,即使查詢字串上有其他參數,此模式仍可運作。

<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 為靜態時減少重寫規則的數目,而且無法使用任何模式比對技術來表示重寫邏輯。