共用方式為


使用全域和分散式重寫規則

作者: Ruslan Yakushev

本逐步解說將說明 URL 重寫模組所支援的不同類型規則,並引導您設定全域和分散式重寫規則。

背景

全域重寫規則可用來定義全伺服器 URL 重寫邏輯。 這些規則是在 applicationHost.config 檔案中定義,無法在任何較低的組態層級上覆寫或停用,例如月臺或虛擬目錄。 全域規則一律會在絕對 URL 路徑 (運作,也就是要求不含伺服器名稱的 URI) 。 例如,如果已對 提出 http://localhost/directory1/directory2/index.html要求,則 URL 重寫模組會將 「directory1/directory2/index.html」 當做全域規則的輸入傳遞。

分散式重寫規則可用來定義特定組態範圍特定的URL重寫邏輯。 分散式規則可以定義在任何組態層級 (,但檔案) 使用 web.config 檔案除外。 本機規則一律會在 URL 上運作,相對於定義 Web.config 檔案的位置。 例如,如果在 directory1 的 Web.config 檔案中定義了要求 http://localhost/directory1/directory2/index.html ,且重寫規則定義,則 URL 重寫模組會將 「directory2/index.html」 當做該規則的輸入傳遞。

全域規則集一律會先評估,之後就會使用全域規則集所產生的 URL 字串來評估分散式規則集。

必要條件

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

  1. 已啟用 ASP.NET 角色服務的 IIS 7.0 或更新版本
  2. 已安裝 URL 重寫 Go Live 版本

設定逐步解說案例

為了示範如何使用全域和本機規則,我們將實作將子域對應至目錄的常見案例。 這可讓我們使用子域來存取網站上不同目錄中的內容。 例如,使用者可以瀏覽至 http://blog.mysite.com ,而不是 http://mysite.com/blog, 或瀏覽至 http://forum.mysite.com ,而不是 http://mysite.com/forum

若要設定案例,請執行下列步驟:

  1. %SystemDrive%\inetpub\wwwroot\ 資料夾中建立名為 「blog」 和 「forum」 的兩個資料夾。

  2. 複製下列 asp.net 程式代碼,並將它 %SystemDrive%\inetpub\wwwroot\blog 放在名為 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>
          <p>This page is located in blog subdomain.</p>
          <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>
    
  3. 複製下列 asp.net 程式代碼,並將它放在 %SystemDrive%\inetpub\wwwroot\forum 名為 forum.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>
          <p>This page is located in forum subdomain.</p>
          <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>
    
  4. 開啟名為 「hosts」 的檔案,其位於 %SystemDrive%\windows\system32\drivers\etc\ ,並在其中新增下列兩行:

    127.0.0.1 forum_localhost
    127.0.0.1 blog_localhost
    

    新增這幾行之後,會開啟網頁瀏覽器,並流覽至 http://blog_localhost/blog/article.aspx 和 , http://forum_localhost/forum/forum.aspx 並確認頁面在瀏覽器中正確轉譯。

建立全域重寫規則

首先,我們將建立全域重寫規則,以根據主機標頭重寫 URL。 例如,如果提出要求 http://blog_localhost/article.aspx ,規則會將URL路徑變更為 「blog/article.aspx」。。

若要在 IIS 管理員中使用 URL Rewrite UI 建立全域規則,請遵循下列步驟:

  1. 移至 IIS 管理員
  2. 在瀏覽樹檢視中,選取伺服器節點。
  3. 在 [功能檢視] 中,按兩下 [URL 重寫模組]
    WIN 兩 K 八 R T M 首頁的螢幕快照。U R L 重寫圖示會反白顯示。
  4. 在 [動作] 窗格中,按兩下 [新增規則...]
    U R L 重寫頁面的螢幕快照。[動作] 窗格中的 [新增規則] 會反白顯示。
  5. 在 [新增規則] 對話框中,選取 [空白規則],然後按兩下 [確定]:
    [新增規則] 對話框的螢幕快照。已選取 [空白規則] 圖示。

現在我們必須定義實際的重寫規則。 在 URL 重寫模組重寫規則中,會藉由指定四個基本資訊片段來定義:

  • 規則的名稱
  • 用於比對 URL 字串的模式
  • 選擇性的條件集
  • 符合模式且所有條件檢查都成功時要執行的動作

命名規則

在 [名稱] 文本框中,輸入可唯一識別規則的名稱,例如:「子域對應」。

定義模式

在 [模式] 文字框中,輸入下列字串:

(.*)

此字串是正則表達式,指定模式會比對任何URL字串,包括空字串,而且它會在反向參考中擷取相符的字串。

定義條件

按下 [新增條件] 按鈕:

[編輯規則] 頁面的螢幕快照。在 [條件] 類別中,[新增條件] 會反白顯示。

按兩下 [新增...]按鈕可顯示用於定義條件的對話框。

[編輯規則] 頁面的螢幕快照。[條件] 類別中的 [新增] 按鈕會反白顯示。
針對 [條件輸入:],輸入下列字串:“{HTTP_HOST}”。 這會設定 URL 重寫模組,以使用 HTTP 要求主機標頭的值作為條件的輸入

在下拉式方塊中,選取 [符合模式]。

在 [模式] 文本框中,輸入 “^ ([^_]+) _[^_]+”。 此正則表達式將用來比對我們已建立的網域 (blog_localhost 和forum_localhost) ,並將 “_” 符號之前的字串部分擷取回回參考。 例如,字串 「blog_localhost」,它會在回溯參考中保留 「blog」。。

指定所有屬性之後,條件對話框看起來應該如下所示:

[編輯條件] 對話框的螢幕快照。在 [條件] 輸入方塊中,會寫入文字括弧 H T T P 底線 HOST 右括弧。核取 [忽略大小寫] 複選框。

按兩下 [確定] 以儲存條件,並返回 [新增規則] UI。

定義動作

由於我們所建立的規則應該重寫 URL,因此請在 [動作] 群組框中選擇 [重寫] 動作類型。 在 [重寫 URL:] 文字框中,輸入下列字串:

{C:1}/{R:1}

此字串會指定應重寫輸入 URL 的內容。 條件 {C:1} 的反向參考會當做資料夾的名稱使用,然後使用規則 {R:1} 的反向參考來保留規則模式中擷取的任何專案。

保留所有其他設定的預設值。 [編輯規則] UI 應該會顯示為下列頁面:

[編輯規則] 頁面的螢幕快照。[輸入]、[類型] 和 [模式] 數據行全都有文字。

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

若要瞭解如何套用此規則,讓我們逐步解說 HTTP 用戶端要求此 URL 時,URL 重寫模組所執行的步驟:
http://blog_localhost/article.aspx?id=323:

  1. URL 重寫模組會將 「article.aspx?id=323」 作為規則的輸入 URL 傳遞至規則,並成功比對規則模式,並在規則反向參考 {R:1} 中擷取它
  2. 主機標頭值 (“blog_localhost”) 與正則表達式 “^ ([^_]+) _[^_]+” 成功比對,因此會在條件後參考 {C:1} 中擷取 “blog”
  3. 根據替代字串 {C:1}/{R:1},URL 會重寫為 “blog/article.aspx?id=323”。

測試規則

若要測試規則是否正確重寫 URL,請開啟因特網瀏覽器並要求下列 URL:
http://blog_localhost/article.aspx?id=123

U R L 重寫模組測試頁面的螢幕快照。顯示 [伺服器變數] 資訊和 [值] 資訊。

您應該會看到 URL 重寫模組已變更 URL,並在 「blog」 目錄中開啟 Article.aspx 頁面。 URL 重寫模組所做的變更是以從主機標頭擷取的信息為基礎。

同樣地,當您要求 http://forum_localhost/forum.aspx?id=345 URL 時,會重寫為 /forum/forum.aspx?id=345

建立分散式規則

我們剛才建立的全域規則是用來根據從主機標頭擷取的資訊,將要求對應至資料夾。 現在,我們將建立分散式規則,以允許我們擁有不含查詢字串參數的 URL。 分散式規則會接受作為 URL 的輸入,該 URL 已由全域規則修改,並會對它執行其他修改。 特別是:

  • “blog” 資料夾中的重寫規則會將 URL 路徑從 “article/234/some-title” 重寫為 “article.aspx?id=234&title=some-title”
  • “forum” 資料夾中的重寫規則會將 URL 路徑從 “topic/123/some-topic-title” 重寫為 “forum.aspx?topic=some-topic-title&id=123”

您可以使用 IIS 管理員或編輯 web.config 檔案來建立本機規則。 為了示範目的,我們將手動編輯 web.config 檔案來建立規則。

若要建立分散式重寫規則:

  1. 在資料夾中建立空白 web.config 檔案 %SystemDrive%\inetpub\wwwroot\**blog** 。 在文字編輯器中開啟它,然後將下列 XML 程式代碼貼到其中:

    <?xml version="1.0" encoding="UTF-8"?>
    <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>
      </system.webServer>
    </configuration>
    
  2. 在資料夾中建立空白 web.config 檔案 %SystemDrive%\inetpub\wwwroot\**forum** 。 在文字編輯器中開啟它,然後將下列 XML 程式代碼貼到其中:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <system.webServer>
        <rewrite>
          <rules>
            <rule name="Rewrite to forum.aspx">
              <match url="^topic/([0-9]+)/([_0-9a-z-]+)"/>
              <action type="Rewrite" url="forum.aspx?topic={R:2}&amp;id={R:1}"/>
            </rule>
          </rules>
        </rewrite>
      </system.webServer>
    </configuration>
    

測試全域和分散式規則

若要測試所有規則都正常運作,請開啟網頁瀏覽器,並向 提出要求 http://blog_localhost/article/234/some-title。 瀏覽器中的回應應該表示 URL 第一次由全域規則變更,然後已由分散式規則額外修改。

同樣地,如果您要求 http://forum_localhost/topic/123/some-topic-title,您應該會看到 URL 重寫模組會將要求的 URL 字串變更為 “/forum/forum.aspx?topic=some-topic-title&id=123”。

U R L 重寫模組測試頁面的螢幕快照。U R L 字串已變更。

摘要

在本教學課程中,您已使用全域規則來實作子域對應案例,然後使用分散式規則來啟用這些資料夾中網頁的使用者易記 URL。