为什么我的路由出现404错误?

时间:2013-02-26 21:27:16

标签: .htaccess codeigniter routing

在我的网站根目录(var / www)中,我的.htaccess文件中包含以下内容:

RewriteCond %{REQUEST_URI} ^system.*
RewriteCond $1 !^(index\.php|vges|images|robots\.txt)


RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /test/index.php?/$1 [L]


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

然后我有一个带有codeigniter项目的子目录(/ var / www / test)。它还有一个.htaccess文件,其中包含以下内容:

RewriteEngine On
RewriteCond $1 !^(index\.php|quiz|vges|buddy|css|fonts|img|images|js|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

当我访问localhost时,我可以查看测试目录,当我进入测试目录时,我会显示默认的控制器视图。但是当我访问localhost / test / controller时,我收到404错误的错误:

The requested URL /index.php/events was not found on this server.

编辑:我通过将最后一行/var/www/vges.htaccess更改为:

找到了解决方案
RewriteRule ^(.*)$ test/index.php/$1 [L]

虽然我怀疑是否要将此测试项目上传到服务器,但它不是子目录,我可能会收到错误。什么是最好的解决方案?什么应该 我更改了我的.htaccess文件

  1. 我的本地计算机上可以有子目录
  2. 当我将它们作为单独的项目(例如测试项目)上传到服务器时,我不必修改.htaccess文件。
  3. 感谢。

1 个答案:

答案 0 :(得分:1)

首先,.htaccess文件适用于它们所在的目录以及每个子目录。您的CodeIgniter特定规则应位于var/www/test/ CI目录中 - 通常是CI的index.php文件所在的位置。

其次,你的根.htaccess有点奇怪。 RewriteCond条件会累积,直到RewriteRule规则触发,然后重置它们。您的两个%{REQUEST_URI}条件相互冲突,因为URI无法同时启动。我不确定这个.htaccess规则是做什么的,但是如果从根开始的URL与你的CI应用程序没有关系,我认为首先不必将它放在那里。如果不知道您的目录结构以及您希望网站如何运作,我无法肯定地说。

kjetilh是对的 - 除非您的环境共享完全相同的设置,否则.htaccess不太可能具有普遍功能。您最好的选择是尽可能简单地启动它们,并根据需要进行修改。 CI 2.1.x的良好启动.htaccess类似于:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

您可以添加资产目录或您不希望在第三个RewriteCond中重定向的任何路径(请记住正确转义正则表达式字符,例如句点)。如果CI位于子目录中,RewriteBase规则肯定会派上用场。您也不需要2.1.x的系统和应用程序文件夹引用,因为这些文件夹有自己的.htaccess文件阻止访问它们。