為二級域名的問題搞了2天,狂郁悶。。。。先是用程序,感覺太累贅,簡單的又不好使(用iframe嵌入,比較糟糕,不能像真正的域名一樣訪問),後來發覺URL Rewrite是最簡單的解決辦法……搜IIS用的Rewrite,下載、試用……,查資料、看說明——唉,E文不好,走了不少彎路!莫笑(地處偏僻,身邊難見高人)
如果是用apache就簡單多了,默認的Rewrite模塊功能強大,可以輕松提取主機頭信息。
具體內容:
0、首先需要一個有效的頂級域名,並且設置該域名下二級域名的泛解析到虛擬主機所在服務器ip(即如:*.eboat.cn => 123.234.55.101)。
1、在http://www.helicontech.com/download.htm下載ISAPI_Rewrite Lite Free版本。版本不用太高,如果願意付點$,用Full版當然也不錯哦。安裝,隨便裝在哪個位置。
注意:Lite版本不支持虛擬主機層次的配置,但僅僅是配置(就是dll只能讀取自身安裝目錄下的全局配置httpd.ini)。如果是僅用於某虛擬主機的任意二級域名解析,可以將ISAPI_Rewrite.dll僅放置在該虛擬主機的配置中(即不在IIS的“網站>ISAPI篩選器”中插入,而是添加在虛擬主機網站的ISAPI篩選器中),這樣就不會影響服務器對其它網站的處理。
2、將需要二級域名的虛擬主機的主機頭置空,使得所有未在服務器上單獨配置的虛擬主機域名都被定向到此處。注意!不是在服務器上單獨新建一個無主機頭的網站,必須在需要實現二級域名的當前網站上進行URL的Rewrite配置。這點很重要。
3、將ISAPI_Rewrite安裝時自動配置在IIS中的全局設定取消(IIS>網站>ISAPI篩選器,刪除ISAPI_Rewrite),在需要二級域名解析的虛擬主機(網站)中配置ISAPI_Rewrite.dll(屬性>ISAPI篩選器>添加...,名稱可以隨便寫,如Url-Rewrite)。
4、修改ISAPI_Rewrite安裝目錄下的配置文件httpd.ini。舉例如下:
Java代碼
[ISAPI_Rewrite]
RepeatLimit 1
# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
# 排除當前虛擬主機需要正常訪問的域名(web.eboat.cn www.eboat.cn)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多數情況下是一個,即當前提供二級域名服務的系統(如建站系統)
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]
# 解決不規范目錄(末尾無/)的問題
# 但前提是目錄名不含‘.’而文件名必須包含,否則無法區分兩者
# 如果保證URL中的目錄名稱規范,則無需此規則
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]
# 提取任意的二級域名名稱(即第一個詞匯)
# 用[a-zA-Z0-9_-]限制名稱字符,重寫Url到Home/子目錄下
# 如 test.eboat.cn => web.eboat.cn/Home/test
RewriteCond Host: ([a-zA-Z0-9_-]+)\.eboat\.cn
RewriteRule ^/(.*) /Home/$1/$2 [I,L]
[ISAPI_Rewrite]
RepeatLimit 1
# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]
# 排除當前虛擬主機需要正常訪問的域名(web.eboat.cn www.eboat.cn)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多數情況下是一個,即當前提供二級域名服務的系統(如建站系統)
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]
# 解決不規范目錄(末尾無/)的問題
# 但前提是目錄名不含‘.’而文件名必須包含,否則無法區分兩者
# 如果保證URL中的目錄名稱規范,則無需此規則
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]
# 提取任意的二級域名名稱(即第一個詞匯)
# 用[a-zA-Z0-9_-]限制名稱字符,重寫Url到Home/子目錄下
# 如 test.eboat.cn => web.eboat.cn/Home/test
RewriteCond Host: ([a-zA-Z0-9_-]+)\.eboat\.cn
RewriteRule ^/(.*) /Home/$1/$2 [I,L]
注意!上面的規則不能寫成
RewriteRule ^/(.*) http\://web\.eboat\.cn/Home/$1/$2 [I,L]
這也是必須在系統所在網站上解析的原因。如果最後是[I,R],訪問是可以的,但是浏覽器的地址欄會顯示實際的Url,達不到透明二級域名的效果。
總結:
之前查了Google,沒找到簡單實現的例子。其實這主要是規則上的問題,即使是將ISAPI_Rewrite放在IIS的“網站”全局配置中也是可以的,因為規則不會匹配其它的網站(頂級域名限制),Rewrite不會起作用。只是放在全局配置中,訪問其它網站也要經過這個.dll過濾器,或多或少的有些不合理。
成功配置和運行,網上說要用Full的破解版才行(1.x的版本,試過可行)。所以這裡特地將Lite免費版的用法貼出來。
(注意:最後可能需要重啟IIS服務器,檢查一下ISAPI過濾器中Rewrite是否已經載入——綠色的向上箭頭。另外,如果是NTFS文件系統,ISAPI_Rewrite的安裝目錄需要添加網站用戶或everyone的寫權限!)