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了
如何去掉 URL 中的 index.php
前往
- Software
- ↳ CodeCharge Studio
- ↳ CodeCharge
- ↳ DemoCharge
- ↳ SuperPDF
- ↳ 551einv
- ↳ E3進銷存
- 程式語言
- ↳ PHP
- ↳ CodeLobster PHP Edition
- ↳ Yii
- ↳ CodeIgniter
- ↳ Phalcon
- ↳ Symfony
- ↳ FuelPHP
- ↳ Zend Framework 2
- ↳ laravel
- ↳ WordPress
- ↳ ASP.NET/C#
- ↳ ASP/VBScript
- ↳ JSP
- ↳ Java Servlets
- ↳ ColdFusion
- ↳ Perl
- ↳ Java Script
- ↳ jQuery
- ↳ HTML + CSS
- ↳ jQuery
- ↳ nodejs
- ↳ VB6
- ↳ Git
- ↳ App Inventor 2
- ↳ bash
- ↳ C++/ VC/ OpenCV
- ↳ OpenCV
- ↳ go
- ↳ cordova
- ↳ python
- ↳ Xamarin
- ↳ Assembly
- 資料庫
- ↳ MySQL
- ↳ PostgreSQL
- ↳ ORACLE
- ↳ Access
- ↳ SQL Server
- ↳ SQLite
- ↳ MariaDB
- ↳ Mongodb
- 作業系統
- ↳ Linux
- ↳ Ubuntu
- ↳ CentOS
- ↳ Mint
- ↳ Mandriva
- ↳ Debian
- ↳ Red Hat Enterprise Linux
- ↳ Oracle Linux
- ↳ Fedora
- ↳ Kali Linux
- ↳ OpenSUSE
- ↳ Elementary OS
- ↳ Microsoft
- ↳ Server 2008 R2
- ↳ Server 2012 R2
- ↳ Server 2012
- ↳ 8
- ↳ 10
- ↳ System Center 2016
- ↳ NOVELL
- ↳ FreeBSD
- ↳ VMware
- ↳ VirtualBox
- ↳ Mac OS X
- ↳ Solaris
- ↳ iOS
- ↳ Android
- ↳ Cloud
- ↳ OpenStack
- ↳ Docker
- ↳ Proxmox VE
- ↳ CloudReady
- ↳ chrome
- 網頁伺服器
- ↳ apache
- ↳ tomcat
- ↳ nginx
- ↳ IIS
- ↳ JBoss
- ↳ weblogic
- ↳ WebHosting
- 硬體
- ↳ 硬體及週邊
- ↳ RouterOS
- ↳ LEGO NXT
- ↳ Arduino
- ↳ MSP430
- ↳ Raspberry Pi
- ↳ OpenERP
- ↳ Storage
- ↳ Server
- ↳ Brocade
- ↳ MODELS
- ↳ FortiGate
- 軟體
- ↳ sublime
- ↳ LibreNMS