目錄
- 先決條件
- 設(shè)置測試網(wǎng)頁
- 創(chuàng)建重寫規(guī)則
- 命名規(guī)則
- 定義模式
- 定義動作
- 查看配置文件中的重寫規(guī)則
- 測試重寫規(guī)則
- 創(chuàng)建重定向規(guī)則
- 測試重定向規(guī)則
- 創(chuàng)建訪問阻止規(guī)則
- 測試訪問阻止規(guī)則
- 概要
先決條件
本演練需要滿足以下先決條件:
IIS安裝 URL Rewrite Module 2.1
短地址http://www.iis.net/extensions/URLRewrite
下載頁面
https://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads
下載鏈接
https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_en-US.msi
https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi
啟用了ASP.NET角色服務(wù)的IIS 7或更高版本。
URL重寫模塊已安裝。有關(guān)更多信息,請參見使用URL重寫模塊。
設(shè)置測試網(wǎng)頁
為了演示URL重寫模塊如何工作,我們將使用一個簡單的測試ASP.NET頁面。該頁面讀取Web服務(wù)器變量,并在瀏覽器中輸出它們的值。
復(fù)制以下ASP.NET代碼,并將其放在名為article.aspx的文件的%SystemDrive%\ inetpub \ wwwroot \文件夾中:
<%@ 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>
復(fù)制此文件后,瀏覽http://localhost/article.aspx并檢查頁面是否在瀏覽器中正確呈現(xiàn)。
創(chuàng)建重寫規(guī)則
我們將創(chuàng)建一個簡單的重寫規(guī)則,該規(guī)則將使用以下格式重寫URL:
http://localhost/article/342/some-article-title
至:
http://localhost/article.aspx?id=342&title=some-article-title。
我們將使用IIS管理器中的URL重寫UI創(chuàng)建一個重寫規(guī)則。為此,請按照下列步驟操作:
1、轉(zhuǎn)到IIS管理器。
2、選擇默認(rèn)網(wǎng)站。
3、在“功能視圖”中,單擊“ URL重寫”。
![](/d/20211016/4591f459ab6d5a48d10348329d6bb39a.gif)
4、在右側(cè)的“操作”窗格中,單擊“添加規(guī)則…”。
![](/d/20211016/f11356d8d45585371c0cefb39808ea78.gif)
5、在“添加規(guī)則”對話框中,選擇“空白規(guī)則”,然后單擊“確定”。
![](/d/20211016/00c425f75d2badd95b963e00d4247225.gif)
現(xiàn)在,您必須定義實際的重寫規(guī)則。在URL重寫模塊中,通過指定四項必需的信息來定義重寫規(guī)則:
- 規(guī)則名稱。
- 用于匹配URL字符串的模式。
- 可選的一組條件。
- 匹配模式并執(zhí)行所有條件檢查是否成功時要執(zhí)行的操作。
命名規(guī)則
在“名稱”文本框中,輸入將唯一標(biāo)識該規(guī)則的名稱,例如:“重寫為article.aspx”。
![](/d/20211016/39aa0efa9827168fb7ac935ae5f01922.gif)
定義模式
在模式文本框中,輸入以下字符串:
^article/([0-9]+)/([_0-9a-z-]+)
此字符串是一個正則表達(dá)式,它指定該模式將與滿足以下條件的任何URL字符串匹配:
- 以字符“ article /”的序列開頭。
- 在第一個“ /”之后包含一個或多個數(shù)字字符。
- 在第二個“ /”之后包含一個或多個字母數(shù)字或“ _”或“-”字符。
請注意,正則表達(dá)式的某些部分在括號內(nèi)。這些括號創(chuàng)建捕獲組,以后可以通過使用反向引用在規(guī)則中對其進行引用。
定義動作
由于我們要創(chuàng)建的規(guī)則應(yīng)該重寫URL,因此請選擇“操作”組框中列出的“重寫操作”類型。在“重寫URL:”文本框中,輸入以下字符串:
article.aspx?id={R:1}&title={R:2}
此字符串指定應(yīng)將輸入URL重寫為的新值。請注意,對于查詢字符串參數(shù)的值,我們使用了{(lán)R:1}和{R:2},它們是對使用括號在規(guī)則模式中定義的捕獲組的反向引用。
保留所有其他設(shè)置的默認(rèn)值?!熬庉嬋胝疽?guī)則”屬性頁面應(yīng)類似于以下頁面:
![](/d/20211016/236bebc4b5c21daf0e3dfa03d7414de5.gif)
通過單擊右側(cè)的“應(yīng)用”來保存規(guī)則。
查看配置文件中的重寫規(guī)則
重寫規(guī)則存儲在ApplicationHost.config文件或Web.config文件中。要檢查我們剛剛創(chuàng)建的規(guī)則的配置,請打開%SystemDrive%\ inetpub \ wwwroot中的Web.config文件。在此文件中,您應(yīng)該看到<rewrite>包含此規(guī)則定義的部分:
<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網(wǎng)站(WAWS)的Web.config中配置URL重寫。
測試重寫規(guī)則
要測試該規(guī)則是否正確重寫了URL,請打開Web瀏覽器并請求以下URL:
http://localhost/article/234/some-title
您應(yīng)該看到Web服務(wù)器上的重寫規(guī)則已將原始URL更改為Article.aspx,并且已將“ 234”和“ some-title”作為查詢字符串參數(shù)的值傳遞。
![](/d/20211016/3fd7fdfb9a3b9876b5044458d6e0cd81.gif)
創(chuàng)建重定向規(guī)則
現(xiàn)在,我們將創(chuàng)建一個重定向規(guī)則,該規(guī)則將以以下格式重定向所有URL:
http://localhost/blog/some-other-title/543
格式如下:
http://localhost/article/543/some-other-title
重定向規(guī)則使一個以上的URL可以指向一個網(wǎng)頁。
為此,請在IIS管理器中打開URL重寫功能視圖UI。單擊“添加規(guī)則…”,然后再次選擇“空白規(guī)則”模板。
在“編輯規(guī)則”頁面中,輸入以下內(nèi)容:
- 名稱:從博客重定向(這是規(guī)則的唯一名稱。)
- 模式:^ blog /([[_ 0-9a-z-] +)/([0-9] +)(此模式將匹配以“ blog”開頭的URL字符串,并將URL的第二和第三部分捕獲為反向引用。)
- 行動:重定向(重定向動作將導(dǎo)致重定向響應(yīng)發(fā)送回瀏覽器。)
- 重定向URL:article / {R:2} / {R:1}(此替換字符串將用作重定向URL;請注意,它使用反向引用來保留和重新排列模式匹配期間捕獲的原始URL。)
輸入名稱,樣式和操作,如下所示:
![](/d/20211016/340a471ee692b1956e2c106b643b4816.gif)
輸入重定向URL,如下所示:
![](/d/20211016/26b4ef2802517fc9af8af95f12cea63b.gif)
保留所有其他設(shè)置的默認(rèn)值。通過單擊右側(cè)的“應(yīng)用”來保存規(guī)則。
測試重定向規(guī)則
要測試該規(guī)則是否正確重定向了請求,請打開Web瀏覽器并請求以下URL:
http://localhost/blog/some-other-title/323
您應(yīng)該看到,http://localhost/article/323/some-other-title由于執(zhí)行重定向規(guī)則,瀏覽器被重定向到,然后根據(jù)您先前創(chuàng)建的重寫規(guī)則重寫了請求。
![](/d/20211016/543ee1cb2a6b9dc472c12e8b7a32bc90.gif)
創(chuàng)建訪問阻止規(guī)則
我們將創(chuàng)建的第三條規(guī)則用于阻止對網(wǎng)站的所有請求(如果這些請求未設(shè)置主機頭)。當(dāng)您要防止通過針對服務(wù)器的IP地址而不是使用主機名發(fā)出HTTP請求而進行的黑客嘗試時,這種類型的規(guī)則很有用。
我們將在不使用IIS管理器的情況下創(chuàng)建此規(guī)則。%SystemDrive%\inetpub\wwwroot\在本文開頭用于article.aspx測試文件的文件夾中打開Web.config文件。找到該<rewrite>部分。將以下規(guī)則插入<rules>集合中,使其成為該集合中的第一條規(guī)則:
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
該<rewrite>部分應(yīng)類似于以下代碼:
<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>
讓我們分析規(guī)則以了解它的作用。
<match url=".*"/>
上面的元素表示該規(guī)則將匹配任何URL字符串。
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
上面的元素為規(guī)則添加了一個條件,該條件通過讀取服務(wù)器變量HTTP_HOST來檢索主機頭值,并將其與模式“ localhost”進行匹配,然后取反結(jié)果。換句話說,該條件驗證主機頭與“ localhost”不匹配。
<action type="AbortRequest" />
上面的元素告訴URL重寫模塊結(jié)束HTTP請求。
測試訪問阻止規(guī)則
要測試此規(guī)則,請打開Web瀏覽器并向發(fā)出請求http://127.0.0.1/article/234/some-title。您應(yīng)該看到的是沒有從服務(wù)器收到任何響應(yīng)的瀏覽器。但是,如果您請求http://localhost/article/234/some-title,則Web服務(wù)器將成功響應(yīng)。
失敗的顯示如下:
![](/d/20211016/cef87380fd729060093b05ed8145658c.gif)
成功顯示如下:
![](/d/20211016/a38712646f98fd15ffe156fdfc621de4.gif)
概要
在本演練中,您學(xué)習(xí)了如何通過使用IIS管理器或手動編輯Web.config文件來配置URL重寫規(guī)則。在本演練中創(chuàng)建的規(guī)則演示了URL重寫模塊的一些重要功能,例如正則表達(dá)式支持以及使用HTTP標(biāo)頭和服務(wù)器變量進行重寫決策的能力。