Rewrite
最近不小心沉迷在研究Apache的mod_rewrite,
剛好也有點心得,
所以寫篇簡單心得放在這裡吧。
其實一切都是因為我從Cakephp裡的.htaccess得到一些靈感開始的,
所以我就以Cakephp的rewrite方法來作點說明吧!
首先看到Cakephp根目錄下的.htaccess檔吧:
第一行和最後一行基本上算是必備,
所以不用問太多加下去就對了XD
第二行開始,代表著你要啟用RewriteEngine的功能,
這一行必加,因為不加的話,你也不會知道為啥你的rewrite無效~
第三、四行則代表要把所有的Request導向給app/webroot,
換言之,Cakephp根目錄下的index.php基本上是擺好玩的!
既然前面提到已經被導向至app/webroot了,
那麼就繼續看app/webroot/.htaccess的內容吧:
第一行、第二行和最後一行內容跟前段相同,所以就不多說了,
比較有意思的是第三、四、五行。
其意義如下:
最近不小心沉迷在研究Apache的mod_rewrite,
剛好也有點心得,
所以寫篇簡單心得放在這裡吧。
其實一切都是因為我從Cakephp裡的.htaccess得到一些靈感開始的,
所以我就以Cakephp的rewrite方法來作點說明吧!
首先看到Cakephp根目錄下的.htaccess檔吧:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
</IfModule>
第一行和最後一行基本上算是必備,
所以不用問太多加下去就對了XD
第二行開始,代表著你要啟用RewriteEngine的功能,
這一行必加,因為不加的話,你也不會知道為啥你的rewrite無效~
第三、四行則代表要把所有的Request導向給app/webroot,
換言之,Cakephp根目錄下的index.php基本上是擺好玩的!
既然前面提到已經被導向至app/webroot了,
那麼就繼續看app/webroot/.htaccess的內容吧:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>
第一行、第二行和最後一行內容跟前段相同,所以就不多說了,
比較有意思的是第三、四、五行。
其意義如下:
- RewriteCond %{REQUEST_FILENAME} !-d
意義:任何附掛的字串都不會被視為一個目錄
比如你輸入http://localhost/cakephp/a/s/d,(cakephp是你放cakephp檔案的目錄)
那麼rewrite將會把a/s/d當成一般字串,而不會繼續去尋找cakephp下是不是有目錄a、目錄s。 - RewriteCond %{REQUEST_FILENAME} !-f
意義:任何附掛的字串都不會被視為一個檔案
比如你輸入http://localhost/cakephp/a/s/d.css,(cakephp是你放cakephp檔案的目錄)
那麼rewrite將會把a/s/d當成一般字串,而不會繼續去尋找cakephp下是不是有目錄a、目錄s、或是檔案d.css。 - RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
以上所提到的附掛字串都被當成一個參數,其名稱為url,
指派給這個目錄下的index.php(就是app/webroot/index.php啦)處理。
注意後面的[QSA,L],
QSA(Querystring appedned)代表著要附掛Querystring給index.php,
至於L(Last)代表最後一條rewrite規則。