使用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的方法之前,有幾件事情要先交代一下

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

好,梗鋪得很長我知道,那就開始設定了

總共有5個步驟

Step 1: 確定apache有啟動mod_rewrite模組

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

作法

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

#LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

將註解拿掉,存檔
就好了

 

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

# Include module configuration:
Include mods-enabled/*.load
Include mods-enabled/*.conf

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

peter@mfc118:/etc/apache2$ ll mods-enabled/
總計 8
drwxr-xr-x 2 root root 4096 2010-12-31 14:08 ./
drwxr-xr-x 7 root root 4096 2010-11-29 10:21 ../
lrwxrwxrwx 1 root root   28 2010-11-09 15:45 alias.conf -> ../mods-available/alias.conf
lrwxrwxrwx 1 root root   28 2010-11-09 15:45 alias.load -> ../mods-available/alias.load
lrwxrwxrwx 1 root root   33 2010-11-09 15:45 auth_basic.load -> ../mods-available/auth_basic.load
(略)…

會發現裡面都是指向mods-available/的soft link

 

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

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

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

 

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

$ sudo a2enmod

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

rewrite

就ok了

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

Step 2: 利用.htaccess建立URL改寫規則

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

  1. 在預設環境中.htaccess是不存在的,要手動建立
  2. 要放置在要apache的根目錄或其子目錄下

然後把下面的程式碼填到把下面的程式碼填到.htaccess裡面

<IfModule mod_rewrite.c>   # if tag 裡面放的是mod_rewrite 有啟動時要做的事情
    
    RewriteEngine On  #打開改寫引擎
    RewriteBase /  #這裡要說明說明.htaccess的擺放路徑,/ 代表擺放在apache的根目錄下
    
    #改寫規則一
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA]
    
     #改寫規則二
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ ./index.php?/$1 [L,QSA]

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

</IfModule>

<IfModule !mod_rewrite.c>  # if tag 裡面放的是mod_rewrite 沒有啟動時要做的事情
    # 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>

Step 3: 確定apache可以讀取.htaccess

真的很煩我知道
但是還是要用好他才行

作法

到httpd.conf找到下列這段(註一)

<VirtualHost *:80>
        ....
	<Directory 這裡是apache根目錄的實際路徑>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride None
		Order allow,deny
		allow from all
	</Directory>
        ....
</VirtualHost>

AllowOverride None

改成

AllowOverride FileInfo

AllowOverride All

就OK了(註二)

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

*註2:
如果在.htaccess中不設定RewriteBase的話
就要改成

AllowOverride AuthConfig FileInfo

Step 4: 修改CodeIgniter 的 Config

作法

在config.php中
找到

$config['index_page'] = "index.php";

修改成

$config['index_page'] = "";

Step 5: 重啟apache

作法

執行下列指令

$ sudo service apache2 restart

打完收工

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

廣告