Codeigniter无法正确路由

net*_*rox 5 php url routing codeigniter

我安装了Apache for Windows.我买了CodeIgniter Professional并下载了他们的源代码.它说我应该把它的.htaccess放在网站的根文件夹中,所以我做了.我将基本URL设置为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]
Run Code Online (Sandbox Code Playgroud)

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

试图让它运转起来浪费了几个小时,我正在失去耐心.

以下是CodeIgniter Professional的说明:

"为了使CodeIgniter可以访问这些文件夹,你还需要在你的网站的根文件夹中创建一个小的.htaccess文件.这就是.htaccess文件的样子.它基本上包含所有文件和文件夹的指令可在网站上查看:

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

如果您熟悉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错误.

Tim*_*one 8

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

首先,我只是不再使用PATH_INFOCodeIgniter路由,因为它没有必要.将您的.htaccess文件更改为:

RewriteEngine On

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

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

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

$config['url_suffix'] = "/";
Run Code Online (Sandbox Code Playgroud)

编辑:确保它mod_rewrite也正常工作..htaccess在RewriteEngine指令后面的文件顶部试试这个:

RewriteRule .* http://stackoverflow.com/ [L,R]
Run Code Online (Sandbox Code Playgroud)

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

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

一旦您的URL被重写,它将被检查以确定mod_rewrite应该如何处理它.当您的URL指向本地资源并包含前导斜杠时,请mod_rewrite保持原样.如果没有,则添加每个目录前缀.

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