利用URL重寫實現參數目錄化

參數目錄化,就是將 相似 http://www.abc.com/store/store.aspx?id=1024 這樣的網址,對外改成 http://www.abc.com/1024php

要實現這種功能,能夠用如下三種方式(應該不只限這三種吧!)html


一、用微軟的 Microsoft URL 重寫模塊 2.0,但只能給IIS7使用,IIS6不行。程序員

64位:web

http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=1b8c7bd8-8824-4408-b8fc-49dc7f951a00正則表達式

32位:apache

http://www.microsoft.com/zh-cn/download/details.aspx?id=5747編程

二、isapi_rewriteapi

http://www.helicontech.com/download-isapi_rewrite3.htm
服務器

但徹底版有日期限制,若是不想掏錢,有大牛破解了,能夠用下面這個:app

http://download.csdn.net/detail/keke0307/3867086

三、urlrewriter.net

這個有源代碼,能夠本身編譯。


機緣巧合之下,我用了方法一 和 二。由於開發機器是WIN7,裝了IIS7,因此用微軟的重寫模塊;而服務器是WIN2003,就用了isapi_rewrite。

下面就這兩種方法分別作一點心得介紹。

事實上,這兩種方法大同小異,IIS基本上不用怎麼配置,沒有網上說的那麼玄妙,又是勾選,又是映射,又是權限之類,關鍵在於要寫對正則表達式。


一、微軟的 Microsoft URL 重寫模塊 2.0

安裝好以後,就能夠改寫網站下的web.config了。

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0"/>
    <httpRuntime/>
  </system.web>
  <system.webServer>
    <rewrite>
      <rules>
	<!-- 實現http://localhost/1024 ==> http://localhost/store/store.aspx?id=1024 -->
        <rule name="storecode">
          <match url="^([1-9][0-9]*)/?$" ignoreCase="true"/>
          <action type="Rewrite" url="/store/store.aspx?id={R:1}"/>
        </rule>
	<!-- 實現http://localhost/1024/p=1&c=1 ==> http://localhost/store/store.aspx?id=1024&p=1&c=1 -->
        <rule name="storecode with param">
          <match url="^([1-9][0-9]*)/([^/]+)/?$" ignoreCase="true"/>
          <action type="Rewrite" url="/store/store.aspx?id={R:1}&{R:2}"/>
        </rule>
	<!-- 下面這些聽說是從Discuz論壇裏導出來的,確定是正確的,供學習借鑑 -->
        <!--
                <rule name="已導入的規則 1">
                    <match url="^userinfo-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="userinfo.aspx?userid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 2">
                    <match url="^showforum-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showforum.aspx?forumid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 3">
                    <match url="^showtopic-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showtopic.aspx?topicid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 4">
                    <match url="^showforum-([0-9]+)-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showforum.aspx?forumid={R:1}&page=

{R:2}" appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 5">
                    <match url="^showtopic-([0-9]+)-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showtopic.aspx?topicid={R:1}&page=

{R:2}" appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 6">
                    <match url="^archiver/showforum-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="archiver/showforum.aspx?forumid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 7">
                    <match url="^archiver/showtopic-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="archiver/showtopic.aspx?topicid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 8">
                    <match url="^archiver/showtopic-([0-9]+)-([0-9]+)\.html$" 

ignoreCase="false" />
                    <action type="Rewrite" url="archiver/showtopic.aspx?topicid={R:1}

&page={R:2}" appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 9">
                    <match url="^archiver/showforum-([0-9]+)-([0-9]+)\.html$" 

ignoreCase="false" />
                    <action type="Rewrite" url="archiver/showforum.aspx?forumid={R:1}

&page={R:2}" appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 10">
                    <match url="^tools/rss-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="tools/rss.aspx?forumid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 11">
                    <match url="^tools/spacerss-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="tools/rss.aspx?uid={R:1}&type=space" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 12">
                    <match url="^tools/photorss-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="tools/rss.aspx?uid={R:1}&type=photo" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 13">
                    <match url="^space\/((\w|\s)+)((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="space/index.aspx?user={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 14">
                    <match url="^space\/((\w|\s|-)+)((\/?))?\?((.*)+)$" ignoreCase="false" 

/>
                    <action type="Rewrite" url="space/index.aspx?user={R:1}&{R:5}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 15">
                    <match url="^showdebate-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showdebate.aspx?topicid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 16">
                    <match url="^showbonus-([0-9]+)\.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showbonus.aspx?topicid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 17">
                    <match url="^postgoods-(\d+)*.html$" ignoreCase="false" />
                    <action type="Rewrite" url="postgoods.aspx?categoryid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 18">
                    <match url="^showgoodslist-(\d+)(-(\d+))?.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showgoodslist.aspx?categoryid={R:1}

&page={R:3}" appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 19">
                    <match url="^showgoods-(\d+)*.html$" ignoreCase="false" />
                    <action type="Rewrite" url="showgoods.aspx?goodsid={R:1}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 20">
                    <match url="^install((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/install{R:1}" />
                </rule>
                <rule name="已導入的規則 21">
                    <match url="^upgrade((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/upgrade{R:1}" />
                </rule>
                <rule name="已導入的規則 22">
                    <match url="^aspx/([0-9]+)((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/aspx/{R:1}{R:2}" />
                </rule>
                <rule name="已導入的規則 23">
                    <match url="^archiver((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/archiver{R:1}" />
                </rule>
                <rule name="已導入的規則 24">
                    <match url="^space((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/space{R:1}" />
                </rule>
                <rule name="已導入的規則 25">
                    <match url="^doc((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/doc{R:1}" />
                </rule>
                <rule name="已導入的規則 26">
                    <match url="^(([\w|\-|_])+)((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/{R:1}/list.aspx" />
                </rule>
                <rule name="已導入的規則 27">
                    <match url="^(([\w|\-|_])+)((\/?))?\?(.)*$" ignoreCase="false" />
                    <action type="Rewrite" url="/{R:1}/list.aspx?{R:2}" 

appendQueryString="false" />
                </rule>
                <rule name="已導入的規則 28">
                    <match url="^(([\w|\-|_])+)/([0-9]+)((\/?))?$" ignoreCase="false" />
                    <action type="Rewrite" url="/{R:1}/{R:3}/list.aspx" />
                </rule>
                <rule name="已導入的規則 29">
                    <match url="^(([\w|\-|_])+)/([0-9]+)((\/?))?\?(.)*$" ignoreCase="false" 

/>
                    <action type="Rewrite" url="/{R:1}/{R:3}/list.aspx?{R:4}" 

appendQueryString="false" />
                </rule>
-->
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

關鍵是要 寫對正則表達式 ,不然系統會報沒法找到資源的404錯誤。真他媽的。就不能報點別的錯誤?害得我在網上瘋狂搜索,覺得差了哪裏沒配置,還差點將IIS重裝了。網上也不會告訴你這個答案,他們只是建議將文件是否存在的選項去掉,諸如此類。

HTTP 錯誤 404.0 - Not Found

您要找的資源已被刪除、已改名或暫時不可用。


同一站內的,就用Rewrite,目標頁面在另外一站點的,則用 Redirect。如

          <rule name="img show">
              <match url="^showimg/([a-zA-Z_0-9]+)/([1-9][0-9]*)/?$" ignoreCase="true"/>
              <action type="Redirect" url="http://localhost:8006/handler.ashx?{R:1}={R:2}"/>
          </rule>


二、isapi_rewrite

安裝以後,就能夠直接使用了。打開IIS6,點擊網站-屬性,會看到:


點 EDIT,會在網站根目錄下生成一個.htaccess文件。在裏面編寫咱們的正則表達式:

# Helicon ISAPI_Rewrite configuration file
# Version 3.1.0.87

RewriteRule ^([1-9][0-9]*)/eurl\.axd/  /store/store.aspx\?id=$1 [NC]
RewriteRule ^([1-9][0-9]*)/([^/]*)?/? /store/store.aspx\?id=$1&$2 [NC]


其正則表達式的語法,彷佛跟微軟的URL重寫模塊沒有多大區別,而且它還自帶了一個正則表達式測試器,打開 .htaccess文件的時候,在編輯器菜單裏能夠看到,RegExp test





而後IIS6還要將Isapi_rewrite.dll做爲篩選器器


但我發現有如下幾點須要注意:

一、正則表達式裏,不能出現問號(「\?」),不然必定匹配失敗,但正則表達式絕對正確,放在其餘正則表達式測試器裏測試,也OK,但在這裏就不行。不知道什麼緣由。翻遍互聯網,有個兄弟說:

這是由於 url 裏面 ? 後面的不被 apache 認爲是 requested uri 的內容,因此你怎麼寫都沒法取得。
建議你修改 url 格式:好比把 ? 去掉;或者改變獲取方式:好比改爲 RewriteRule /?(.*)$ /reg.php?id=$1&%

帖子:http://bbs.csdn.net/topics/300052355

但我這個是IIS耶!真搞不懂,無論了。因此我本來想將優化後的地址設爲:http://www.abc.com/1024?p=1&c=1的,結果怎麼試都不成功,最後只能放棄問號,改爲:http://www.abc.com/1024/p=1&c=1

二、IIS6 + .net 4的狀況下,IIS會自動在無後綴(什麼叫無後綴?不懂)地址後加上 "/eurl.axd/guid號",恰好跟我機器同樣。原本這個在ASP.NET處理過程當中,會被自動去掉,但在這裏,通過轉向後,竟然還保留了下來,我在測試過程當中,在目標頁面顯示 Request.QueryString,竟然可恥地顯示出這種不速之客:



網上有文章介紹用修改註冊表的方式來屏蔽

http://www.admin10000.com/document/1244.html

但我想着之後可能會採用MVC模式,因此只在寫正則表達式時將這個因素考慮進去了:

RewriteRule ^([1-9][0-9]*)/eurl\.axd/  /store/store.aspx\?id=$1 [NC]

三、每條規則後面必要時要帶上適當的flag。

isapi_rewrite的RewriteRule就是後面經常帶上一些古怪的標識,好比[NC]、[L]之類,它們是幹什麼的?

其實它們頗有用,好比:

[NC],忽略大小寫

[L],在一連串的匹配規則中,當系統找到第一個匹配的規則後,就再也不往下匹配其餘規則了。這個特別有用,好比:

我有一、二、3三條規則,有個輸入狀況按照個人設想,是應該規則2起做用,最爲匹配,但規則3是規則2的超集,一樣也能夠匹配。若是規則2後面沒有這個[L]標識,那麼起做用的,會是規則3!

[R],當即轉向,好比將某個輸入,Redirect到別的網站或網址啦,使用這個標識,我感受速度會快一點。

還有許多標識(flag),能夠查閱這裏:

http://www.helicontech.com/isapi_rewrite/doc/RewriteRule.htm

是英文的,但做爲一個計算機程序員,咱們仍是要習慣閱讀英文文檔,這有時比直接閱讀那些翻譯得奇形怪狀的中文文檔還好理解。有時候我以爲老外編程那麼厲害,經常提出這思想那思想,這模式那模式,是由於他們閱讀、交流沒有什麼障礙,接受東西就比咱們快。咱們吃了這個虧。

我本身的英文很是爛,很不習慣讀英文文檔,但從今日後,要慢慢習慣了。與豬君共勉!

相關文章
相關標籤/搜索