IIS 7 為 URL Rewrite 模組建立重寫規則
http://www.cnblogs.com/haogj/p/5041720.html
http://www.cnblogs.com/haogj/p/5041720.html
URL Rewrite 模組是 IIS 伺服器的一個可下載的擴充套件模組,在 Windows Azure Web Sites (WAWS) 已經是預安裝的,可以直接使用。這個演練教程將帶領你建立並驗證一系列常用的 URL 重寫規則。
前置條件
這個演練需要下列條件:
1. IIS7 或者更高版本,ASP.NET 服務必須啟用。
建立測試頁面
下面的練習將使用 IIS 的預設配置,預設網站將位於 %SystemDrive%\inetpub\wwwroot\ 資料夾中。
為了演示 URL Rewrite 模組是如何工作的,我們將建立一個簡單的 ASP.NET 頁面,這個頁面會讀取 Web Server 的變數並把它的值輸出到頁面中。
在 wwwroot 資料夾中,建立名為 article.apsx 的檔案,將下面的 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 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>
測試重寫規則
開啟瀏覽器,在位址列中輸入: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,訪問應該成功。
不成功的訪問結果如下。
而成功的訪問如下。