我安装了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错误。
答案 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文件夹中。