Codeigniter无法正确路由

时间:2010-08-04 01:18:07

标签: php url codeigniter routing

我安装了Apache for Windows。我买了CodeIgniter Professional并下载了他们的源代码。它说我应该把它的.htaccess放在网站的根文件夹中,所以我做了。我将基本网址设置为http://127.0.0.1/kids/,其中kids是网站的根文件夹。它显示主页很好。当我点击链接时,它总是给出404错误。它说,“在这台服务器上找不到请求的URL /index.php/welcome/cat/2。”我在目录中尝试了几种可能的.htaccess但没有成功。在.htaccess中,它指示:

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

解释为什么它根本不起作用?我还检查了configs.php,看起来也没问题。 config ['index_page']设置为空白。我删除了.htaccess文件但仍然存在同样的问题,除了它说“在此服务器上找不到请求的URL / kids / welcome / cat / 2”。

因为试图让它工作而浪费了几个小时而我正在失去耐心。

以下是CodeIgniter Professional的说明:

“要使CodeIgniter可以访问这些文件夹,您还需要在网站的根文件夹中创建一个小的.htaccess文件。这就是.htaccess文件的样子。它基本上包含allmvs某些文件的说明和可在网站上查看的文件夹:

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

如果您熟悉Apache中的mod_rewrite,您会注意到此规则表面上从任何目标的URL中删除了index.php。下面当你配置CodeIgniter(特别是config.php文件)时,你会明白为什么这是一个好主意。如果你不熟悉Apache中的mod_rewrite,请不要被这个文件吓到太多。基本上,.htaccess文件提出了一些规则,其中一个规则从所有URL中删除了index.php。文件中的其他规则允许使用您将需要的各种其他文件夹(例如包含CSS,JavaScript,Captcha文件和图像的文件夹)。“

我按照指示做了...将htaccess文件放在根文件夹中然后,它给出了404错误。如果我从根文件夹中删除htaccess文件,它会显示主页。如果我添加htaccess文件,则会出现404错误。我移动了htaccess,它没有做任何重新路由。显然,Apache理解htaccess,否则它不会显示404错误。

2 个答案:

答案 0 :(得分:8)

您的路线可能无法正确解决,但我不确定。我建议采取以下步骤。

首先,我会为您的CodeIgniter路由使用PATH_INFO,因为它没有必要。将您的.htaccess文件更改为:

RewriteEngine On

RewriteCond $0 !^(index\.php|images|captcha|css|js|robots\.txt)
RewriteRule ^.*$ index.php [L]

然后,在您的配置中,确保$config['uri_protocol']设置为AUTO(默认值,我相信)或REQUEST_URI

之后,最可能的原因是您的路由期望URL上有一个尾随斜杠。我不太了解CodeIgniter知道特定设置的配置位置,但是您可以使用以下配置指令使您的URL具有尾部斜杠:

$config['url_suffix'] = "/";

修改:确保mod_rewrite正在运行。在.htaccess指令后面的RewriteEngine文件顶部试试这个:

RewriteRule .* http://stackoverflow.com/ [L,R]

如果你被重定向到Stack Overflow,至少我们知道这是有效的。如果没有,您没有收到500错误,因此问题出在.htaccess文件中,在这种情况下,您应确认服务器配置中相应的<Directory>条目,以确定您的网站位置位于磁盘上已设置AllowOverride All

编辑:我应该更好地了解正斜杠,对不起。出现此问题的原因是mod_rewrite在每个目录(.htaccess)上下文中的工作方式。

重写网址后,会对其进行检查,以确定mod_rewrite应该对其执行的操作。当您的URL指向本地资源并包含前导斜杠时,mod_rewrite会保持原样。如果没有,则添加每个目录前缀。

当它保持原样时,内部重定向到/index.php,在这种情况下,假定是来自主机(localhost)的完全限定URL。因此,请求的资源最终为http://localhost/index.php。添加每个目录前缀后,重写引擎中的后续步骤会尝试从路径中删除DocumentRoot(如果存在)。这使我们留下/kids/index.php,然后将其传递给内部重定向,并按预期解析。

答案 1 :(得分:0)

试试这个:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^(.*)$ /index.php/$1 [NC,L]

将它放在index.php所在的kids文件夹中。