原文名稱:Creating Rewrite Rules for the URL Rewrite Modulehtml
原文做者:Ruslan Yakushev正則表達式
URL Rewrite 模塊是 IIS 服務器的一個可下載的擴展模塊,在 Windows Azure Web Sites (WAWS) 已是預安裝的,能夠直接使用。這個演練教程將帶領你建立並驗證一系列經常使用的 URL 重寫規則。windows
這個演練須要下列條件:瀏覽器
1. IIS7 或者更高版本,ASP.NET 服務必須啓用。服務器
2. 已經安裝了 URL Rewrite 模塊,詳細內容參見:Using the URL Rewrite Module.學習
下面的練習將使用 IIS 的默認配置,默認網站將位於 %SystemDrive%\inetpub\wwwroot\ 文件夾中。測試
爲了演示 URL Rewrite 模塊是如何工做的,咱們將建立一個簡單的 ASP.NET 頁面,這個頁面會讀取 Web Server 的變量並把它的值輸出到頁面中。網站
在 wwwroot 文件夾中,建立名爲 article.apsx 的文件,將下面的 ASP.NET 代碼複製到這個文件中。ui
<%@ 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 ,確承認以在瀏覽器中正確看到頁面內容。
咱們將建立下面的簡單重寫規則。
原地址:http://localhost/article/342/some-article-title
重寫後
目標地址:http://localhost/article.aspx?id=342&title=some-article-title
咱們將使用 IIS 管理器中的 URL Rewrite 管理界面來建立重寫規則,請參考下列步驟:
1. 打開 IIS 管理器
2. 選中 Default Web Site
3. 在特性視圖中,點擊 URL Rewrite
4. 在右側的 Action 面板中,點擊 Add Rules... 添加規則
5. 在 Add Rules 添加規則對話框中,選擇 Blank Rule 空白規則,而後點擊 Ok 肯定。
如今能夠定義實際的重寫規則了。在 URL Rewrite 模塊中,每一個重寫規則必須提供下面的四個信息:
1. 規則名稱
2. 匹配目標 URL 的正則表達式模板。
3. 條件選項
4. 在模板匹配,而且條件成立的狀況下,須要採起的動做。
在 Name 名稱文本框中,輸入一個惟一的規則名稱,好比:"Rewrite to article.aspx"
在 Pattern 匹配模板文本框中,輸入以下的正則表達式。
^article/([0-9]+)/([_0-9a-z-]+)
這是一個正則表達式,將會匹配符合下面規則的衆多 URL 地址。
1. 開始的字符序列是 "article/"
2. 在第一個 / 以後,包含一個或者多個數字字符
3. 在第二個 / 以後,包含一個或者多個字母,數字,下劃線或者連字線。
注意,在正則表達式中使用了圓括號,圓括號用來建立捕獲組,在後面能夠經過反向引用來使用它。
由於咱們定義的規則但願重寫 URL,在 Action Type 下拉列表框中選擇 Rewrite 重寫動做類型,在重寫目標的 Rewrite URL 輸入框中,輸入下面的內容。
article.aspx?id={R:1}&title={R:2}
這裏使用指定了一些變量用於重寫 URL,注意在查詢字符串中,咱們使用了 {R:1} 和 {R:2},這些就是剛剛提到的反向引用。
對於其它設置咱們使用默認值,這樣整個編輯規則的頁面應該看起來以下所示。
在右邊的面板中,點擊 Apply 保存規則。
咱們定義的重寫規則將會保存在 ApplicationHost.config 或者 Web.config 中。爲了查看咱們剛剛建立的重寫規則,打開位於 %SystemDrive%\inetpub\wwwroot\ 中的 Web.config 文件,應該在 <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}&title={R:2}" /> </rule> </rules> </rewrite>
上面的語法也一樣適用於 Windows Azure Web Sites (WAWS) 中的 Web.config 。
打開瀏覽器,在地址欄中輸入:http://localhost/article/234/some-title
你會在頁面中看到服務器的重寫規則將 URL 修改成 Article.aspx,而且將 234 和 "some-title" 做爲查詢參數傳遞。
下面咱們建立一個重定向規則。
源地址:http://localhost/blog/some-other-title/543
定向爲:http://localhost/article/543/some-other-title
重定向規則能夠將多個 URL 地址定向到同一個地址頁面。
打開 IIS 管理器的 URL Rewrite 特性窗口,點擊 Add Rule(s)... 添加規則,再次選擇 Blank Rule 空白模板。
在編輯規則的頁面中,輸入下列內容:
1. 規則名稱:Redirect from blog (這是規則的惟一名稱)
2. 匹配模板:^blog/([_0-9a-z-]+)/([0-9]+) (這個模板用來匹配以 blog 開頭的地址,捕獲第二和第三節用於反向引用)
3. 動做:Redirect (重定向動做致使向瀏覽器發送一個 redirect 響應)
4. 目的 URL:article/{R:2}/{R:1} (這個模板用於重定向,注意,這裏使用反向引用使用了前面的捕獲組)
輸入以後的界面應該以下所示。
輸入 redirect URL 以後。
其它配置保持不變,在右面的面板中點擊 Apply 應用規則。
打開一個瀏覽器,在地址欄中輸入:http://localhost/blog/some-other-title/323
在瀏覽器中,你會看到地址被重定向到 http://localhost/article/323/some-other-title。
第三個規則,咱們將阻止沒有特定請求頭的請求。這個規則能夠用來阻止使用 Ip 地址代替主機名稱的黑客攻擊。
此次,咱們不使用 IIS 管理器來建立規則,而是直接在位於 %SystemDrive%\inetpub\wwwroot\ 的 Web.config 中建立規則。找到 <rewrite> 配置節,在 rules 部分將新內容插入到最前面,使這個新規則成爲規則集中的第一個規則。
<rule name="Fail bad requests"> <match url=".*"/> <conditions> <add input="{HTTP_HOST}" pattern="localhost" negate="true" /> </conditions> <action type="AbortRequest" /> </rule>
如今的所有的重寫規則以下所示。
<rewrite> <rules> <rule name="Fail bad requests"> <match url=".*"/> <conditions> <add input="{HTTP_HOST}" pattern="localhost" negate="true" /> </conditions> <action type="AbortRequest" /> </rule> <rule name="Redirect from blog"> <match url="^blog/([_0-9a-z-]+)/([0-9]+)" /> <action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" /> </rule> <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>
理解一下剛剛定義的規則。
<match url=".*"/>
這個匹配規則說咱們將會匹配任何的 URL
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
這個元素爲規則建立了一個條件,經過讀取 HTTP_HOST 來獲取請求地址中的主機部分,匹配 localhost ,而後取反。也就是說,這個條件檢查請求地址中的 Host 不包含 localhost。
<action type="AbortRequest" />
這個動做停止請求的處理。
打開瀏覽器,經過 Ip 地址訪問咱們的服務器:http://127.0.0.1/article/234/some-title,你應該沒有從服務器獲得任何響應。若是你使用 http://localhost/article/234/some-title,訪問應該成功。
不成功的訪問結果以下。
而成功的訪問以下。
在這個演練中,咱們學習瞭如何建立 URL Rewrite 規則,既經過 IIS 管理器方式,也經過手動方式。這個演練演示了 URL Rewrite 模塊的主要使用方式,好比正則表達式的支持,以及經過 HTTP 請求頭的信息和服務器變量來做爲重寫的條件。