參數目錄化,就是將 相似 http://www.abc.com/store/store.aspx?id=1024 這樣的網址,對外改成 http://www.abc.com/1024。php
要實現這種功能,能夠用如下三種方式(應該不只限這三種吧!)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>
同一站內的,就用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]
而後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
是英文的,但做爲一個計算機程序員,咱們仍是要習慣閱讀英文文檔,這有時比直接閱讀那些翻譯得奇形怪狀的中文文檔還好理解。有時候我以爲老外編程那麼厲害,經常提出這思想那思想,這模式那模式,是由於他們閱讀、交流沒有什麼障礙,接受東西就比咱們快。咱們吃了這個虧。
我本身的英文很是爛,很不習慣讀英文文檔,但從今日後,要慢慢習慣了。與豬君共勉!