2014年6月9日 星期一

CodeIgniter 去除網址中的index.php

自從開始由CI寫PHP後每次都覺得那多餘的index.php很難看,尤其是之前在寫使用CodeIgniter架設RESTful Web Service這篇文章的時候GET, POST, PUT, DELETE的網址竟然是http://127.0.0.1/~shiun/ws/index.php/service/index,中間那index.php真的讓人受不了.........

這次就來把網址美化一下吧

1. 開啟mod_rewrite

Shiun@ShiunMac ~ sudo vi /etc/apache2/httpd.conf
啟動Apache的mod_rewrite模組 LoadModule rewrite_module libexec/apache2/mod_rewrite.so

2. 在CI的根目錄下新增.htaccess並加入以下內容

#IfModule代表module有啟動才會執行IfModule內的內容 <IfModule mod_rewrite.c> #啟動rewrite引擎 RewriteEngine On #這裡指的是CI的位置,也就是CI位於根目錄下的哪個路徑中 RewriteBase /ci/ #改寫規則一: 所有要往/ci/system下的request都導到index.php下 RewriteCond %{REQUEST_URI} ^system.* RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA] #改寫規則二: 所有要往/ci/application下的request都導到index.php下 RewriteCond %{REQUEST_URI} ^application.* RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA] #改寫規則三: 若網址後的參數不為index.php, images, css, js, robots.txt, favicon.ico任何一項 RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico) #且request的不是一般檔案 RewriteCond %{REQUEST_FILENAME} !-f #且request也不是資料夾 RewriteCond %{REQUEST_FILENAME} !-d #將request參數導到index.php下 RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA] </IfModule> #如果mod_rewrite沒有啟動的話 <IfModule !mod_rewrite.c> # If we don't have mod_rewrite installed, all 404's # can be sent to index.php, and everything works as normal. ErrorDocument 404 /index.php </IfModule>

3. 重新啟動apache

Shiun@ShiunMac ~ sudo apachectl restart

4. 用新網址瀏覽網頁吧~,少了index.php感覺好看超多~


補充: 由於筆者的根目錄是/~shiun/ws/,因此RewriteBase這行要改成/~shiun/ws/才會動


mod_rewrite補充說明

  由於大多Google到的結果都沒針對mod_rewrite為什麼要這麼寫解釋,害筆者心中總少了啥,因此筆者另外收集並補充以上用到的mod_rewrite規則說明

  1. RewriteCond代表要滿足的條件,若滿足RewriteCond的條件則往下一行繼續執行

  2. 若連續出現數行RewriteCond且RewriteCond最後沒有提示OR, AND之類的文字,則預設為AND比對,例如"改寫規則三"就是連續三個RewriteCond的AND比對

  3. "改寫規則一"中出現的$1為 ^(.*)$ 這個正規表示式的結果,上述三個改寫規則的^(.*)$指的就是domain name之後的所有文字
    例如 aaa.org/index.php?a=b 中的index.php?a=b就是$1

  4. 每個改寫規則最後出現的[L, QSA]中的L代表這條改寫規則結束

  5. [L,QSA]的QSA代表將Query的參數補到網址的最後面
    例如 aaa.org/index.php?a=b&c=d,要是沒有QSA的話rewrite模組會把"?"後所有Query參數砍掉


參考資料
1. [CodeIgniter]如何去掉 URL 中的 index.php
2. 如何透過.htaccess檔,來使用URL redirect/rewrite功能?
3. .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)

1 則留言: