天天看點

艾偉:重提URL Rewrite(2):使用已有元件進行URL Rewrite

  可能已經沒有人會使用上一篇文章中的方法進行URL Rewrite了,因為提供URL Rewrite的元件早已鋪天蓋地了。

  如果要使用URLRewriter,首先自然就是在web.config中配置一個HttpModule:

<httpModules>

  <add name="ModuleRewriter"

       type="URLRewriter.ModuleRewriter, URLRewriter" />

httpModules>

  然後就是進行配置了(注:強烈建議使用configPath屬性将配置提取成額外的檔案,便于管理):

<configSections>

  <section name="RewriterConfig"

           type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter" />

configSections>

<RewriterConfig>

  <Rules>

    <RewriterRule>

      <LookFor>~/tag/([\w]+)/LookFor>

      <SendTo>~/Tags.aspx?Tag=$1SendTo>

    RewriterRule>

  Rules>

RewriterConfig>

  正規表達式是一個非常了不得的東西,能比對,能捕獲。在上面的例子中,我們把符合LookFor條件的“/tag/xxx”重新定位到Tags.aspx頁面上,并且将xxx作為Tag這個QueryString項的值,這樣就能夠在代碼中通過HttpContext.Request.QueryString["Tag"]來獲得該值了。

  <section name="rewriter"

           type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler,

                 Intelligencia.UrlRewriter" />

 

<rewriter>

  <rewrite url="^/User/(\d+)$" to="~/User.aspx?id=$1" processing="stop" />

  <rewrite url="^/User/(\w+)$" to="~/User.aspx?name=$1" processing="stop" />

rewriter>

<system.web>

  <httpModules>

    <add name="UrlRewriter"

         type="Intelligencia.UrlRewriter.RewriterHttpModule,

               Intelligencia.UrlRewriter" />

  httpModules>

system.web>

  我們主要來看一下重寫規則的配置項。與URLRewriter不同的是,UrlRewriter.NET使用了我喜歡的每規則一個節點的方式,這讓整個項目的重寫規則簡潔不少。不過processing="stop"又是什麼意思?這就要談到UrlRewriter.NET在處理重寫規則時的方法了。UrlRewriter.NET在找到一個比對的重寫規則時,不會就此停止,而會繼續尋找其餘的比對項,最終生效的則是能夠比對目前請求的最後一個重寫規則。如果我們需要UrlRewriter.NET在找到某個比對項之後即生效,就需要将processing屬性設為stop。例如在上面的配置裡,如果“/User/”後緊跟着數字,則會使用使用者ID進行查找,否則則認為目前所提供的是使用者名。

  如果UrlRewriter.NET僅僅是因為配置上顯得比較簡潔,它與URLRewriter相比實在沒有什麼優勢。但是UrlRewriter.NET的能力遠不止此,我們剛才使用的其實隻是它提供的Action之一,初次之外它還提供了許多Action:

if

unless

rewrite

redirect

setstatus

forbidden

gone

not-allowed

not-found

not-implemented

addheader

setcookie

setproperty

  由于是在IIS層面進行URL Rewrite,IIRF的配置方式和UrlRewriter.NET是不同的。如果要使用IIRF,則需要将IsapiRewrite4.dll添加到Web Site的ISAPI Filter清單中:

艾偉:重提URL Rewrite(2):使用已有元件進行URL Rewrite

  IIRF是通過ini檔案來配置的,IsapiRewrite4.ini與IsapiRewrite4.dll放在同樣的目錄中即可:

RewriteRule    ^/User/(\d+)$    /User.aspx?id=$1      [I, L]

RewriteRule    ^/User/(\w+)$    /User.aspx?name=$1    [I, L]

  IIRF的重寫規則是“RewriteRule            []”,每個部分之間的空格數目沒有限制,不過一定要是空格,而不能是Tab等其他空白字元。“url-pattern”和“destination”自不必多說,關鍵在于modifier。IIRF的modifier有不少,在這裡我先隻介紹上面用到的兩個。“I”表示比對時大小寫無關,“L”的作用和UrlRewriter.NET裡的processing="stop"類似,IIRF在找到該比對項時立即生效,而不會繼續查找下去。

  IIRF雖然是一個開源的元件,但是功能依然比較強大。尤其是結合了RewriteCond(Rewrite Condition)之後,可以實作比較複雜的重寫規則。例如以下的配置則把UserAgent裡包含Googlebot字樣的根目錄請求重寫到某個特定的資源上:

RewriteCond    %{HTTP_USER_AGENT}    ^Googlebot.*

RewriteRule    ^/    $/Googlebot.html    [L]

  最後,我們來看一下兩種元件Rewrite的差別。顯然,最大的差別就在于它們是不同層面上的重寫,下面的兩幅示意圖就描述了在兩種情況下它們是如何将原本應該得到“404 Resource Not Found”結果的“/User/jeffz”請求重寫至“/User/name=jeffz”的。

  首先是UrlRewriter.NET在ASP.NET層面上的URL Rewrite:

艾偉:重提URL Rewrite(2):使用已有元件進行URL Rewrite

  接着是IIRF在IIS層面上的URL Rewrite:

艾偉:重提URL Rewrite(2):使用已有元件進行URL Rewrite

  有了這兩個元件,相信我們已經再也不需要其他東西來實作URL Rewrite了。

相關連結:

繼續閱讀