CodeIgniter的重写不起作用

时间:2011-11-24 15:33:38

标签: codeigniter mod-rewrite apache2

我安装了一个干净的Apache2(加上PHP和MySQL)服务器,并在apache配置中启用了mod_rewrite。 我添加了.htaccess文件,以便从URL中删除index.php,如CodeIgniter wiki中所述。

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

我将此文件放在网站的根目录中。

当我尝试访问网址mydomain.local/index.php/welcome时,我会获得CodeIgniter的默认页面。但是当我尝试通过mydomain.local/welcome访问同一页面时,我得到了404页面。

如何检查整个重写规则是否有效?为什么它不起作用?

6 个答案:

答案 0 :(得分:9)

假设您的配置( /application/config/config.php )已禁用index_page:

$config['index_page'] = '';

你的Apache DocumentRoot 是: / srv / www /

创建与 / application / 目录相同级别的 .htaccess 文件,其中包含以下内容:

<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 /

等等,你得到了照片。

答案 1 :(得分:9)

我找到了解决方案。 Apache配置不允许运行htaccess文件。所以我必须将目录上的AllowOverride标志设置为AllowOverride ALL

感谢您的帮助!

答案 2 :(得分:1)

默认.htaccess(来自ci用户指南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]

在localhost上你必须添加&#34; ./"在index.php(第3行)前面,因为在我的情况下,ci目录没有放在root上。我认为&#34; ./" 意味着它应该是相对路径。 对于附加条件".*\.css|.*\.js|.*\.png",这意味着apache不应该使用扩展名css,js和png重写文件。

答案 3 :(得分: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配置中启用mod_rewite

答案 4 :(得分:0)

尝试更改uri_protocol配置设置。此外,某些服务器需要在htaccess文件中进行此修改:

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

最后一次斜线后的问号。试试吧。

还要确保你的mod_rewrite已开启。

答案 5 :(得分:0)

如果您遇到500 Internal Server Error。首先要查找的是apache error.log文件。对我来说,错误与命令AddOutputFilterByType有关。

  

无效命令'AddOutputFilterByType',可能拼写错误或已定义   由未包含在服务器配置中的模块。

对于我的配置,apache配置中未启用两个模块,而.htaccess中正在使用相应的命令。因此,一旦我启用filter_moduledeflate_module,一切都恢复正常。