翻譯:爲 URL Rewrite 模塊建立重寫規則

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

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

原文做者: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}&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 請求頭的信息和服務器變量來做爲重寫的條件。

相關文章
相關標籤/搜索