2011-11-24 65 views
5

我已經安裝了一個乾淨的Apache2(加上PHP &MySQL)服務器,並在Apache配置中啓用了mod_rewrite。 我添加了.htaccess文件以從CodeIgniter wiki中描述的url中刪除index.php。CodeIgniter的重寫不起作用

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

我把這個文件放在網站的根目錄下。

當我嘗試訪問url mydomain.local/index.php/welcome然後我得到CodeIgniter的默認頁面。但是,當我嘗試通過mydomain.local/welcome訪問相同的頁面時,我得到了404頁面。

如何檢查整個重寫規則是否正常工作?爲什麼它不工作?

回答

9

我找到了解決方案。 htaccess文件不允許由Apache配置運行。所以我必須將目錄上的AllowOverride標誌設置爲AllowOverride ALL

感謝您的幫助!

+3

謝謝......正好解決了我的問題 – hforbess

0

你需要從索引頁中刪除的index.php在配置文件中

/application/config/config.php

$config['index_page'] = ''; 

試一下這個東西的.htaccess,這是我使用:

RewriteEngine on 
RewriteCond $1 !^(index\.php|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

您可能還需要在您的apache config中啓用mod_rewite

+0

從文件中刪除它,但它仍然不起作用。 :( –

+0

不工作:(是不是有辦法檢查是否正在執行整個.htaccess文件? –

9

假設您的配置(/application/config/config.php)具有index_page禁用:

$config['index_page'] = ''; 

而且Apache的DocumentRoot /SRV /網絡/

創建一個.htaccess文件與您的/application/目錄具有以下內容:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
</IfModule> 

你應該注意到RewriteBase指向的DocumentRoot(/)。 如果index.php位於另一個目錄中,則應相應地更改RewriteBase

對於這樣的目錄結構:

/srv/www/application/ 
/srv/www/system/ 
/srv/www/index.php 
/srv/www/.htaccess 

RewriteBase應該是:/

對於這樣的目錄結構:

/srv/www/codeigniter/application/ 
/srv/www/codeigniter/system/ 
/srv/www/codeigniter/index.php 
/srv/www/codeigniter/.htaccess 

RewriteBase應:/codeigniter/

等等,你會得到圖片。

0

嘗試更改uri_protocol配置設置。此外,某些服務器需要在htaccess文件中進行以下修改:

RewriteRule ^(.*)$ /index.php/?$1 [L] 

之後的最後一個斜槓處的問號。試試看。

還要確保你的mod_rewrite是打開的。

+0

Mod_rewrite打開並加載基於phpinfo()信息但添加不起作用。我真的開始懷疑,如果整個重寫國防部工作... –

+0

嗯,它重寫任何東西?做一些測試,甚至在CI之外,那麼你將能夠本地化問題。 – Shomz

1

默認的.htaccess(從CI userguide http://ellislab.com/codeigniter/user-guide/general/urls.html

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

我已經搞不清上面了一下代碼,但我有這樣的代碼:

RewriteEngine on 
RewriteCond $1 !^(index\.php|robots\.txt|.*\.css|.*\.js|.*\.png) 
RewriteRule ^(.*)$ ./index.php/$1 [L] 

在本地主機上,你必須添加」。 /「在index.php(第三行)前面,因爲在我的情況下,ci目錄沒有放在根目錄下。我認爲「./」意味着它應該是相對路徑。 對於附加條件".*\.css|.*\.js|.*\.png",這意味着apache不應該用擴展名爲css,js和png的文件重寫。

0

如果您遇到500 Internal Server Error。尋找的第一個地方是apache error.log文件。對我來說,錯誤與命令AddOutputFilterByType有關。

無效的命令「AddOutputFilterByType」,也許拼錯或通過不包括在服務器配置中的模塊定義 。

對於我的配置,在Apache配置中沒有啓用兩個模塊,而在.htaccess中使用了相應的命令。所以一旦我啓用filter_moduledeflate_module一切都恢復正常。