分類
程式技術

有趣的rewrite

之前在設定 apache rewrite 感覺很有趣, 可以做很多應用, 加上功能強大, 幾乎可以將網址改的很炫很讚, 後來也玩了一下 ISAPI_Rewrite (網址: http://www.isapirewrite.com/), HELICON提供的 ISAPI_Rewrite 功能也類似, 免費版本 ISAPI_Rewrite Lite 可以使用於該 iis 上全部的網站, 所以若要設定個別的虛擬主機的 rewrite rule 時, 就要花錢買 ISAPI_Rewrite FULL. 當然 apache 的 rewrite module 是完全免費的囉.


不多說切入正題, 之前玩的都是在 / 之後的, 也就是不含 domain name的 rewrite rule, 雖然不含 domain name, 但已經可以玩很多功能了, 今天就想看有沒有可能連 domain name 都 rewrite, 在提供專屬網址時, 含 domain name 的 rewrite 特別有用, 於是找了一下, 發現做法並不難, 其實只是將 server 變數帶出來而已, 但是要用到兩次的 rewriterule 指令, 方式如下:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.mydomain\.com$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+)\.mydomain\.com(.+) /myprogram.php?name=$1&path=$2

解釋一下內容, 第一行不用說, 就是啟用 rewrite , 第二行是將 domain name 取出來, 並找是需要為 xxx.mydomain.com 這種(這要看應用方式, 這裡的用法是 aa.mydomain.com, bb.mydomain.com …), 第三行是一個重組 rewriterule 指令, 最後的 [C] 旗標是指此行和下行是連鎖的, 若此行不滿足, 則後面皆 skip, 但這行是一定會滿足的, 因為至少會有一個 “/” (斜線), 第四行則是將 xxx.mydomain.com 的 xxx 取出(放至$1), 並將第三行組好的斜線後路徑(含斜線)放至$2, 如此一來就很方便地應用這樣的一個功能, 提供專屬網址, 而且又能利用 rewrite 來取得專屬名稱及所需服務, 接下來如何應用, 就看各位的巧思囉.

參考資料:
http://httpd.apache.org/docs/1.3/misc/rewriteguide.html
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html

[2006/6/30]
今天再來 try isapi_rewrite 發現只要兩行就可以搞定 domain rewrite, code 如下:

#domain rewrite test
RewriteCond %HTTP_HOST (.+)\.test\.com [O]
RewriteRule /(.*) /$2?domain=$1 [I,CL,L]

看起來應該是比 mod_rewrite 還要容易一些, 因為 mod_rewrite 沒辦法在 RewriteCond 時, 就加入 pattern 項目, 也造成一定要多一行 RewriteRule 來串接這些資料, 這個是我目前觀察 isapi_rewrite 唯一比 mod_rewrite 還要易讀精簡的地方.

另外也有 .net rewrite 的資料也可以在閱讀時一併參考.
在 asp.net 中, 可以利用 http handler 進行 url rewrite 處理.

工作原理可以參考這裡:
link1, link2

基本上功能和 apache 的 mod_rewrite 已相去不遠, 功能也十分強大, 有個實作的 open source 的 urlrewriter.net 提供了這樣的程式, 可以參考:
http://urlrewriter.net/index.php/reference/actions/rewrite/

實務上, iis 的 log 仍為 rewrite 前的 url, 和 isapi_rewrite 不太一樣, 因為一個是 iis 的, 一個是 http handler 的.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。