翻譯:為 URL Rewrite 模塊創建重寫規則


原文名稱:Creating Rewrite Rules for the URL Rewrite Module

原文地址:http://www.iis.net/learn/extensions/url-rewrite-module/creating-rewrite-rules-for-the-url-rewrite-module

原文作者:Ruslan Yakushev

URL Rewrite 模塊是 IIS 服務器的一個可下載的擴展模塊,在  Windows Azure Web Sites (WAWS) 已經是預安裝的,可以直接使用。這個演練教程將帶領你創建並驗證一系列常用的 URL 重寫規則。

前置條件

這個演練需要下列條件:

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 代碼復制到這個文件中。

<%@ 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>

 

上面的語法也同樣適用於  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}&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 請求頭的信息和服務器變量來作為重寫的條件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM