IIS URL Rewrite功能

IIS URL Rewrite功能,讓URL變簡潔、或達到隱藏真實URL效果

URL Rewrite: 產生具親和力的網址

URL Rewriting 現在已經成為網站開發的顯學,它不但可以讓使用者不必再記憶一堆帶有參數的網址,也有利於搜尋引擎自動建檔與設定排名的工作,本文將介紹 IIS 7 的擴充套件:URL Rewrite,以在 IIS 上實作出 URL Rewriting 的能力。

URL 與 SEO

自 Internet 發展以來,URL(統一資源定位器)早已成為廣大網路使用者對網路的其中一個印象,如果要在 Internet 上找到自己所需要的資源(不論是網站、網頁、檔案、影像或其他資源),那麼都一定要先得到資源的 URL,才可以利用用戶端工具(瀏覽器或自訂的 HTTP 程式)連線到該 URL 所指向的伺服器,由它來傳回資源。早期網頁都是靜態的,在 URL 的命名上也比較直覺,直到 CGI 程式以及動態伺服器內容產生技術(即 ASP/JSP/PHP 等)廣為應用時,URL 已經不知不覺得讓使用者感到複雜,例如下面兩種網址:

http://www.mycompany.com.tw/products/honey_cake.htmhttp://www.mycompany.com.tw/products/product.aspx?id=19283982&type=cake

一般使用者最喜歡的是第一種 URL,簡單好記又沒有額外的符號,但通常使用資料庫以及內容管理系統管理網站的伺服器,產出的 URL 絕大多數都是第二種,使用者通常很難去記憶他想要的 URL 網址,而是都要去網站首頁再去搜尋自己想要的資料,這點雖然對網站的首頁到訪率提升,但卻忽略了「親民」的重要性。

其實在 2000 年時,就已經有學者提出讓 URL 更親民的概念,這個概念是由 Roy Fielding 博士所提出,稱為「表象化狀態轉換」(Representational State Transfer),簡稱 REST 的概念,它不是技術名詞,而是說明網站的服務應該呈現的方式,他提出了下列四個關鍵功能:

  • 所有資源都要由 URI 來識別。
  • 對資源的操作(即 C/R/U/D)可以直接用 HTTP 的方法(POST/GET/PUT/DELETE)對應存取。
  • 透過資源所顯露的表徵(即 URL)操作資源。
  • 由用戶端來決定應該要回傳的內容(例如RSS讀取器要求的資料為 application/xml,而一般瀏覽器則是 text/html)。

其中的「透過資源所顯露的表徵操作資源」以及「所有資源都要由 URI 來識別」就是今日具親和力的 URL 的基礎。但實際上,親民的 URL 被重視的起因卻與 Google 的崛起有關,當 Google 已經成為全球最大搜尋引擎之際,Google 修改了搜尋引擎收集器(Web Crawler)的演算法(即眾所周知的 PageRank 演算法),將動態網址設定為不計算點擊範圍,因為動態網址的參數是可變的,對於搜尋引擎來說動態參數只是一張網頁,一個 URL 而已,就算企業的網站的動態網頁下擁有數千項產品,但搜尋引擎卻仍然只會存在一筆記錄,這對網路行銷的影響非常大,因此開始有網路行銷公司打出「搜尋引擎最佳化(SEO)」的口號,其中就包含了「具親和力的 URL」,其實這和前面所提到的 REST 有異曲同工之妙,URL Rewriting 技術也是在此時成為 Web 網站開發的重點項目之一。

URL Rewriting

親民的 URL 在商業行為上很重要,但在技術上要實現目前也已經不困難,其中的問題在於如何將外部的 URL(即親民的 URL)轉換成內部真正處理的動態 URL,畢竟不可能要求企業網站為了要做親民的 URL,而去生出來數千張或數萬張靜態網頁,而又不能自動和資料庫連線以更新內容,所以在技術領域便定義了一個新的名詞:URL Rewriting(URL 重寫)。

URL 重寫的原理其實很簡單,當外部的 URL 要求進入伺服器時,伺服器會依照一個既定的規則將 URL 轉換成內部程式使用的格式後,再傳給程式處理,因此程式所看到的 URL 會是經過轉換後的,例如下面的例子:

來源 URL:http://www.mycompany.com.tw/products/cake/honey.htm
轉換規則:
  來源:/products/{0}/{1}.htm
  目的:/products/product.aspx?search={1}&type={0}
轉換後的 URL:http://www.mycompany.com.tw/products/product.aspx?search=honey&type=cake

如此一來,即便使用者輸入好記的 URL,在系統內部仍可以轉換成程式看得懂的 URL 格式,讓企業能夠在動態網頁上直接實現親民的 URL 的能力,而且幾乎不必改寫程式碼,只要在程式執行週期的適當位置上插入處理 URL 的功能即可。大多數可以找的到可以應用在 ASP 或 ASP.NET 的 URL Rewriting 工具,都是在應用程式層由程式的生命週期注入處理的,以 ASP.NET 來說,要在 HTTP Module 中執行下列指令才可以執行重寫:

[C#]
HttpContext.Current.RewritePath(string.Format(“~/products/product.aspx?search={0}&type={1}”, searchParam, typeParam), false);

另一種方式是在 Web 伺服器層來執行 URL Rewriting,這樣的作法可以涵蓋整個應用程式,而且由 Web 伺服器層執行速度也會比較快(透過應用程式層會要多經過應用程式執行期元件的處理),Apache Server 目前已經有 mod_rewrite 模組執行這個工作,而 IIS 7 也有自己的模組:URL Rewrite。

URL Rewrite 介紹

URL Rewrite 是由 IIS 團隊所開發(目前版本為 2.0),在 Web 伺服器層執行 URL Rewriting 的擴充元件,透過 URL Rewrite 模組,不論是靜態或動態的網頁,都可以被轉換成親民的 URL,而且對內部而言它也不會受到外部 URL 的影響,URL Rewrite 會自動將連入要求的 URL 轉換成程式可讀的內部 URL,以讓程式可以保持正常執行。

URL Rewrite 目前支援四種 URL Rewriting 的設定:

  • Blank Rule:由管理人員自行設定 URL Rewriting 的規則,這個功能的彈性是最大的。
  • User friendly URL:由管理人員利用內建的 URL Rewriting 範本來建立親民的URL。
  • Rule with rewrite map:Rewrite Map 是一種規則定義的集合,這個功能可以直接利用現有的 Rewrite Map 來設定重寫的規則。
  • Request Blocking:由管理人員設定 URL Rewriting 的規則,只要符合就擲回 HTTP 的錯誤狀態碼。

 

使用 URL Rewriting (1):建立親民的 URL

讓網站使用者可以很簡單的使用 URL 即可找到想要的資料,是 URL Rewriting 最重要的工作,因此 URL Rewrite 本身有內建一個很容易就產生 URL Rewriting 規則的工具,它就是 User Friendly URLs 範本,在使用 URL Rewrite 的 Add rule 功能時,在 Add Rule 對話盒會有四種規則範本,在這裡選擇『User friendly URL』:

點擊放大

接著會出現規則設定的對話盒:

點擊放大

此時,只要在『Enter an example of internal URL that is used by your dynamic web application』的文字方塊中輸入程式要使用的 URL 格式,在下方的 Rewrite rule definition 中即會出現相對應的 Rewrite Rule 規則定義,以及相對的 Regular Expression 運算式:

點擊放大

同時,下拉式的選單還會提供四種不同的 URL 呈現方式給管理人員選取:

下方還有一個 Create corresponding redirect rule 的核取方塊,這個功能是指如果使用者用內部的 URL 格式連接伺服器時,會自動轉換成親民的 URL 並顯示在瀏覽器的網址列。

設定完成後按 OK,URL Rewrite 即會建立好這個規則:

點擊放大

此時為了要測試 URL Rewriting 的功能,我們在這個網站中根目錄中加入一個 Rewrite.aspx,內容如下:

[HTML]
<%@ 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>

然後開啟 IIS,並輸入前面所輸入的範例URL,IIS 在發現 URL 的規則符合時,即會執行 URL Rewriting,將 URL 轉向給 Rewrite.aspx,並將 URL 中參數的部份轉換成 Rewrite.aspx 的 Query String:

點擊放大

使用 URL Rewriting (2):建立自訂規則的 URL

如果管理人員希望的 URL 格式是 User friendly URL 所不能提供的(例如服務的 URL 或是特殊格式的 URL),則管理人員可以利用 Blank Rule 來建立,若要使用這個方式,則管理人員必須要熟悉 Regular Expression(規則運算式)的語法,也可以由網路找到一些轉換的範例。

點擊放大

例如,我們在這裡定義了下列參數:

參數
Match URL
Requested URL Matches the pattern
Using Regular Expression
Pattern ^article/([0-9]+)/([_0-9a-z-]+)
Action
Action Type Rewrite
Rewrite URL Rewrite.aspx?id={R:1}&title={R:2}

點擊放大

輸入完成後按「套用」即可生效,此時我們在瀏覽器上輸入規則的 URL,IIS 在發現 URL 的規則符合時,即會執行 URL Rewriting,將 URL 轉向給 Rewrite.aspx,並將 URL 中參數的部份轉換成 Rewrite.aspx 的 Query String:

點擊放大

如果要針對 URL 的內容(context),像是 HTTP 方法,查詢字串或是其他部份做進一步的設定,可以利用 Condition 來進行,其規則說明可以參考 IIS.net 中的 URL Rewriting Configuration Reference 文章中的說明:
http://learn.iis.net/page.aspx/665/url-rewrite-module-20-configuration-reference/

使用 URL Rewriting (3):封鎖不合法的 URL 資源

使用 URL Rewriting 除了可以讓 URL 更親民以外,還可以做到不合法資源的封鎖,例如若使用者試圖利用修改參數來探知可能的弱點時,URL Rewriting 可以達到隱藏參數的目的,同時還可以針對不合法的 URL 回應錯誤的內容,像是 HTTP 403(拒絕存取)或是 404(找不到網頁)等。

在 URL Rewrite 模組中,Request Blocking 就是用來處理這件工作的,我們以上面的例子為主,在 Request Blocking 中加入一個設定,只要不符規則的都擲回 HTTP 404:

點擊放大

在 Request Blocking 的設定頁中,請依照下列圖示設定:

Request Blocking 功能可以封鎖的資源有很多種,除了 URL 路徑以外,像是 IP address、Query String、User agent、Host Header 以及 Refer 等都可以過濾。

Request Blocking 可以支援四種回應方式,分為是 HTTP 401、403、404 以及直接捨棄要求等四種。

新增完成後,我們在瀏覽器上故意輸入一個不符規則的 URL,例如 http://localhost/cake/honey/data,當 IIS 發現有不符規則的 URL 時,即會擲回 HTTP 404:

點擊放大

結語

本文很快的介紹了 IIS 7.0 的 URL Rewrite 模組,有了這個模組,Web 網站開發人員即不用再為了 URL Rewriting 的功能傷腦筋,一切交由 IIS 7 的模組來做即可,而管理人員也可以善於利用 URL Rewrite 的功能來保護網站不受刺探式的攻擊,並在網站上使用具親和力的 URL,以提升網站的 SEO 績效。

source: Microsoft