1. 程式人生 > >IIS 7 為 URL Rewrite 模組建立重寫規則

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}&amp;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}&amp;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 請求頭的資訊和伺服器變數來作為重寫的條件。