使用全域和分散式重寫規則
作者: 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 字串來評估分散式規則集。
必要條件
本逐步解說需要下列必要條件:
- 已啟用 ASP.NET 角色服務的 IIS 7.0 或更新版本
- 已安裝 URL 重寫 Go Live 版本
設定逐步解說案例
為了示範如何使用全域和本機規則,我們將實作將子域對應至目錄的常見案例。 這可讓我們使用子域來存取網站上不同目錄中的內容。 例如,使用者可以瀏覽至 http://blog.mysite.com
,而不是 http://mysite.com/blog
, 或瀏覽至 http://forum.mysite.com
,而不是 http://mysite.com/forum
。
若要設定案例,請執行下列步驟:
在
%SystemDrive%\inetpub\wwwroot\
資料夾中建立名為 「blog」 和 「forum」 的兩個資料夾。複製下列 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>
複製下列 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>
開啟名為 「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 建立全域規則,請遵循下列步驟:
- 移至 IIS 管理員
- 在瀏覽樹檢視中,選取伺服器節點。
- 在 [功能檢視] 中,按兩下 [URL 重寫模組]
- 在 [動作] 窗格中,按兩下 [新增規則...]
- 在 [新增規則] 對話框中,選取 [空白規則],然後按兩下 [確定]:
現在我們必須定義實際的重寫規則。 在 URL 重寫模組重寫規則中,會藉由指定四個基本資訊片段來定義:
- 規則的名稱
- 用於比對 URL 字串的模式
- 選擇性的條件集
- 符合模式且所有條件檢查都成功時要執行的動作
命名規則
在 [名稱] 文本框中,輸入可唯一識別規則的名稱,例如:「子域對應」。
定義模式
在 [模式] 文字框中,輸入下列字串:
(.*)
此字串是正則表達式,指定模式會比對任何URL字串,包括空字串,而且它會在反向參考中擷取相符的字串。
定義條件
按下 [新增條件] 按鈕:
按兩下 [新增...]按鈕可顯示用於定義條件的對話框。
針對 [條件輸入:],輸入下列字串:“{HTTP_HOST}”。 這會設定 URL 重寫模組,以使用 HTTP 要求主機標頭的值作為條件的輸入
在下拉式方塊中,選取 [符合模式]。
在 [模式] 文本框中,輸入 “^ ([^_]+) _[^_]+”。 此正則表達式將用來比對我們已建立的網域 (blog_localhost 和forum_localhost) ,並將 “_” 符號之前的字串部分擷取回回參考。 例如,字串 「blog_localhost」,它會在回溯參考中保留 「blog」。。
指定所有屬性之後,條件對話框看起來應該如下所示:
按兩下 [確定] 以儲存條件,並返回 [新增規則] UI。
定義動作
由於我們所建立的規則應該重寫 URL,因此請在 [動作] 群組框中選擇 [重寫] 動作類型。 在 [重寫 URL:] 文字框中,輸入下列字串:
{C:1}/{R:1}
此字串會指定應重寫輸入 URL 的內容。 條件 {C:1} 的反向參考會當做資料夾的名稱使用,然後使用規則 {R:1} 的反向參考來保留規則模式中擷取的任何專案。
保留所有其他設定的預設值。 [編輯規則] UI 應該會顯示為下列頁面:
按下右側的 [套用] 動作來儲存規則。
若要瞭解如何套用此規則,讓我們逐步解說 HTTP 用戶端要求此 URL 時,URL 重寫模組所執行的步驟:
http://blog_localhost/article.aspx?id=323
:
- URL 重寫模組會將 「article.aspx?id=323」 作為規則的輸入 URL 傳遞至規則,並成功比對規則模式,並在規則反向參考 {R:1} 中擷取它
- 主機標頭值 (“blog_localhost”) 與正則表達式 “^ ([^_]+) _[^_]+” 成功比對,因此會在條件後參考 {C:1} 中擷取 “blog”
- 根據替代字串 {C:1}/{R:1},URL 會重寫為 “blog/article.aspx?id=323”。
測試規則
若要測試規則是否正確重寫 URL,請開啟因特網瀏覽器並要求下列 URL:
http://blog_localhost/article.aspx?id=123
您應該會看到 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 檔案來建立規則。
若要建立分散式重寫規則:
在資料夾中建立空白 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}&title={R:2}"/> </rule> </rules> </rewrite> </system.webServer> </configuration>
在資料夾中建立空白 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}&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”。
摘要
在本教學課程中,您已使用全域規則來實作子域對應案例,然後使用分散式規則來啟用這些資料夾中網頁的使用者易記 URL。