如何去掉 URL 中的 index.php

http://ellislab.com/codeigniter

http://www.codeigniter.org.tw/
回覆文章
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

如何去掉 URL 中的 index.php

文章 yehlu »

http://milk4candy.wordpress.com/2010/12 ... index-php/

使用CodeIgniter開發網頁時網頁時,除了呼叫預設Controller的index()方法之外

網頁的的URL中總是會出現一個很醜的index.php

以我自己的環境為例為例:

我的apache根目錄為 /var/www

在此目錄下我放置了一個CodeIgniter目錄名為ci

因此對CodeIgniter來說我的baseurl就是就是: http://localhost/ci

假設我有個Controller叫main.php (在 /var/www/ci/system/application/controller/ 下)

又假設在main.php中有個方法叫test()好了

當我要呼叫test()的時候

URL就會變成 http://localhost/ci/index.php/main/test

然而,我認為這是個很醜的URL

而更重要的是,大家都覺得這是個很醜的URL (至少google出來的結果是這樣沒錯)

因此,就有了解決的方法

但在說明除掉index.php的方法之前,有幾件事情要先交代一下

雖然在別的php framework中也有類似的處理,但本篇文章只針對CodeIgniter
index.php的位置在CodeIgniter的根目錄下 ( for my case, it’s under ci/ )
雖然說是要「除掉」index.php,但只是不讓index.php在URL中出現,index.php仍會且也必須存在
在以下的設定中,我只知道這樣會work。有許多我不知其所以然的地方,無法說明得很詳細,所以還請各位高手大德們不吝指教
好,梗鋪得很長我知道,那就開始設定了

總共有5個步驟

Step 1: 確定apache有啟動mod_rewrite模組
Anyway mod_rewrite 應該是apache中與URL改寫有關的模組(吧?)
因此,要確定他有跑起來

作法
到 /etc/apache2/httpd.conf 中找到一行如下

1
#LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
將註解拿掉,存檔
就好了



但是很不幸的是,在Debian/ubuntu的環境下
httpd.conf的設定已被拆散至許多不同的地方
所以要多花點功夫
首先,httpd.conf大部分的設定都被移到了apache.conf中
於是先打開他再說(也是在/etc/apache2/下)
然後找到下面這段

1
# Include module configuration:
2
Include mods-enabled/*.load
3
Include mods-enabled/*.conf
這段是模組的設定
可以看出來他要引入mods-enabled目錄下以.load 與 .conf結尾的檔案
於是下一步我們就到mods-enabled/裡看看到底是怎麼一回事

1
peter@mfc118:/etc/apache2$ ll mods-enabled/
2
總計 8
3
drwxr-xr-x 2 root root 4096 2010-12-31 14:08 ./
4
drwxr-xr-x 7 root root 4096 2010-11-29 10:21 ../
5
lrwxrwxrwx 1 root root 28 2010-11-09 15:45 alias.conf -> ../mods-available/alias.conf
6
lrwxrwxrwx 1 root root 28 2010-11-09 15:45 alias.load -> ../mods-available/alias.load
7
lrwxrwxrwx 1 root root 33 2010-11-09 15:45 auth_basic.load -> ../mods-available/auth_basic.load
8
(略)…
會發現裡面都是指向mods-available/的soft link



於是再前往mods-available/一探究竟
果然在該目錄下發現rewrite.load這個檔案
打開一看,內容如下

1
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
哇哩勒~ 繞了一大圈結果做的事情一模一樣
所以趕快在mods-enabled/裡作一個指向mods-available/rewrite.load的soft link就就ok啦!



上面兩個方式都是直接修改設定檔的作法,在apache2中好像有個更簡單的方式可以達成
只要利用下列指令

1
$ sudo a2enmod
然後會跳出一堆模組服務問你要開哪一個
然後跟著鍵入

1
rewrite
就ok了

上面三個方法都可以完成步驟一,請挑一個使用即可

Step 2: 利用.htaccess建立URL改寫規則
在啟動了mod_rewrite模組後只是讓apache有了改寫URL的能力
必須還要給予他改寫得規則才行
而這些規則必須要寫在一個名為.htaccess的檔案中
好了,預備知識又要來了

在預設環境中.htaccess是不存在的,要手動建立
要放置在要apache的根目錄或其子目錄下
然後把下面的程式碼填到把下面的程式碼填到.htaccess裡面
01
<IfModule mod_rewrite.c> # if tag 裡面放的是mod_rewrite 有啟動時要做的事情
02

03
RewriteEngine On #打開改寫引擎
04
RewriteBase / #這裡要說明說明.htaccess的擺放路徑,/ 代表擺放在apache的根目錄下
05

06
#改寫規則一
07
RewriteCond %{REQUEST_URI} ^system.*
08
RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA]
09

10
#改寫規則二
11
RewriteCond %{REQUEST_URI} ^application.*
12
RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA]
13

14
#改寫規則三
15
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
16
RewriteCond %{REQUEST_FILENAME} !-f
17
RewriteCond %{REQUEST_FILENAME} !-d
18
RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA]
19

20
</IfModule>
21

22
<IfModule !mod_rewrite.c> # if tag 裡面放的是mod_rewrite 沒有啟動時要做的事情
23
# If we don't have mod_rewrite installed, all 404's
24
# can be sent to index.php, and everything works as normal.
25

26
ErrorDocument 404 /index.php
27
</IfModule>
Step 3: 確定apache可以讀取.htaccess
真的很煩我知道
但是還是要用好他才行

作法
到httpd.conf找到下列這段(註一)
01
<VirtualHost *:80>
02
....
03
<Directory 這裡是apache根目錄的實際路徑>
04
Options Indexes FollowSymLinks MultiViews
05
AllowOverride None
06
Order allow,deny
07
allow from all
08
</Directory>
09
....
10
</VirtualHost>


1
AllowOverride None

改成
1
AllowOverride FileInfo


1
AllowOverride All

就OK了(註二)
*註1:
在Debian/Ubuntu中
要到 /etc/apache2/sites-available/default 裡找到此段來修改

*註2:
如果在.htaccess中不設定RewriteBase的話
就要改成
1
AllowOverride AuthConfig FileInfo
Step 4: 修改CodeIgniter 的 Config
作法
在config.php中
找到
1
$config['index_page'] = "index.php";

修改成
1
$config['index_page'] = "";
Step 5: 重啟apache
作法
執行下列指令
1
$ sudo service apache2 restart
打完收工

這樣應該就可以除掉URL 中的 index.php了
回覆文章

回到「CodeIgniter」