Share via


建立 URL 重寫模組的輸出規則

作者 :Ruslan Yakushev

本檔的這一節適用於 IIS 7 的 URL 重寫模組 2.0 版。

本逐步解說將引導您建立及測試 URL 重寫模組 2.0 的輸出重寫規則。

必要條件

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

  1. 已啟用 ASP.NET 角色服務的 IIS 7 或更新版本;
  2. 已安裝 URL 重寫模組 2.0 RC 版本。

設定測試網頁

為了示範 URL 重寫模組 2 的運作方式,您將使用簡單的 ASP.NET 頁面。 此頁面會讀取 Web 伺服器變數,並在瀏覽器中顯示其值。 它也會使用伺服器變數建構超連結,然後將該連結放入回應 HTML。

建立測試頁面

  1. 在下列資料夾中建立名為 article.aspx 的檔案:

    %SystemDrive%\inetpub\wwwroot\
    
  2. 複製下列 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>
    
  3. 開啟網頁瀏覽器並要求下列 URL,以確保頁面正確轉譯:

    http://localhost/article.aspx
    

新增輸入重寫規則

下一個步驟是新增規則,以重寫具有下列格式的 URL:

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

這些 URL 將會重寫成具有如下的格式:

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

若要新增輸入重寫規則:

  1. 開啟位於下列位置 的web.config 檔案:

    %SystemDrive%\inetpub\wwwroot\
    
  2. /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}&amp;title={R:2}" />
        </rule>
      </rules>
    </rewrite>
    

如需建立輸入重寫規則的詳細資訊,請參閱 建立URL重寫模組的重寫規則

測試輸入重寫規則

您現在可以測試輸入重寫規則是否如設計般運作。

若要測試輸入重寫規則:

開啟網頁瀏覽器並要求下列 URL:

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

如果重寫規則正常運作,您會收到如下所示的伺服器回應:

使用網頁瀏覽器將滑鼠停留在U R L 重寫模組測試頁面的連結上方之後,最終U R L的螢幕快照。

由於輸入規則,您可以使用簡單且方便使用的 URL 結構來存取此網頁。 不過,如果使用者按兩下 HTML 頁面中的超連結,網頁瀏覽器將會使用具有查詢字串參數的 URL。 這不理想,因為下列幾個原因:

  1. 網站訪客會看到您想要使用 URL 重寫規則隱藏的內部 URL 結構。
  2. 多個 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 重寫使用者介面來建立輸出規則。

若要建立輸出規則:

  1. 開啟 IIS 管理員
  2. 選取 [預設網站]
  3. 在 [功能檢視] 中,選取 [URL 重寫]
    在 [默認網站首頁] 窗格中選取 [U R L 重寫] 的螢幕快照。
  4. 在右側的 [動作] 窗格中,按兩下 [新增規則...]。 在 [新增規則] 對話框中,選取 [輸出規則] 類別下的 [空白規則],然後按兩下 [確定]。
    在 [新增規則] 對話框中的 [輸出規則] 底下選取 [空白規則] 範本的螢幕快照。

現在您必須定義實際的輸出規則。 在 URL 重寫模組 2.0 中,會藉由指定下列資訊來定義輸出重寫規則:

  • 規則的名稱。
  • 選擇性前置條件,可控制此規則是否應該套用至回應。
  • 用於比對回應中字串的模式。
  • 一組選擇性的條件。
  • 符合模式且所有條件檢查都成功時所要執行的動作。

命名規則

在 [名稱] 文本框中,輸入將唯一識別規則的名稱,例如:「重寫以清除 URL」。

定義前置條件

前置條件是用來評估是否應在回應上執行輸出規則評估。 例如,如果修改 HTML 內容的規則,只有內容類型標頭設定為 「text/html」 的 HTTP 回應應該針對此規則進行評估。 輸出規則評估和內容重寫是CPU密集作業,可能會對 Web 應用程式的效能造成負面影響。 因此,使用前置條件來縮小套用輸出規則時的案例範圍。

因為您建立的規則應該只套用至 HTML 回應,所以您將定義前置條件,以檢查 HTTP 回應標頭 內容類型 是否等於 「text/html」。。

若要定義前置條件:

  1. 在 [先決條件] 清單中,選取 [<建立新的預先條件>]。

  2. 這會帶您前往 [條件前編輯器] 對話框,您需要在其中定義前置條件。 指定前置條件設定,如下所示:

    • 名稱:“IsHTML

    • 使用:“正則表達式

    • 按兩下 [新增] 以顯示 [新增條件] 對話框。 在這裡對話框中,指定:

      • 條件輸入:“{RESPONSE_CONTENT_TYPE}

      • 檢查輸入字串是否為「符合模式

      • 模式:“^text/html

        使用指定的設定新增條件的螢幕快照。

  3. 單擊 [確定] 以儲存前置條件,並返回 [編輯規則] 頁面。

定義相符的範圍

輸出重寫規則可以在 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]+)(?:&|&amp;)title=([_0-9a-z-]+)$

此字串是正規表示式,指定模式會符合符合下列條件的任何URL字串:

  • 開頭為字元 “/article.aspx?”。
  • 包含具有數值的第一個查詢字串參數。
  • 包含具有英數位元值的第二個查詢字串參數。

請注意,正則表達式的某些部分位於括弧內。 這些括弧會建立擷取群組,稍後可以使用反向參考在規則中參考。 此外,在大部分情況下,「&」 符號是在響應中編碼的 HTML,因此正則表示式模式必須考慮該符號。

定義動作

選擇 [動作] 群組框中的 [重寫] 動作類型。 在 [值] 文字框中,輸入下列字串:

/article/{R:1}/{R:2}

此字串會指定要重寫連結位址的新值。 請注意,針對查詢字串參數的值,表達式會使用 {R:1} 和 {R:2},這是使用括號在規則模式中定義的擷取群組反向參考。

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

使用Is H T M L Pre-condition 套用新的輸出重寫規則之前的螢幕快照

按下右側的 [套用] 動作來儲存規則。

在組態檔中檢視重寫規則

重寫規則會儲存在 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}&amp;title={R:2}" />
  </rule>
 </rules>
 <outboundRules>
  <rule name="Rewrite to clean URL" preCondition="IsHTML">
   <match filterByTags="A" pattern="^/article\.aspx\?id=([0-9]+)(?:&amp;|&amp;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 回應中的連結:

使用網頁瀏覽器將滑鼠停留在U R L 重寫模組測試頁面中的連結上方之後,新U R L的螢幕快照。

現在,如果網站訪客單擊此連結,則會使用全新的URL格式,而且不會顯示此頁面所使用的內部URL表示法。

摘要

在本逐步解說中,您已瞭解如何使用 IIS 管理員或手動編輯 web.config 檔案,在 URL 重寫模組 2.0 中設定輸出重寫規則。 本逐步解說中建立的規則示範 URL 重寫模組 2.0 的一些重要功能,例如輸出重寫、前置條件和標記篩選。