我已经尝试了所有可能的htaccess片段,我可以找到这个,但没有一个会起作用。我的codeigniter项目在ci.mydomain.com上找到,我以这种方式配置了虚拟主机
<VirtualHost *:80>
ServerName ci.mydomain.com
ServerAlias ci.mydomain.com
ServerAdmin x@gmail.com
DocumentRoot /var/www/codeigniter
</VirtualHost>
我也设置了
$config['index_page'] = '';
我刚得到404.怎么了? 我使用的是最新版本2.1.3
更新
<VirtualHost *:80>
RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [PT]
ServerName ci.domain.com
ServerAlias ci.domain.com
ServerAdmin d@d.com
DocumentRoot /var/www/codeigniter
</VirtualHost>
我试过这个,它对我有用。虽然我宁愿使用.htaccess文件。
编辑:伙计们,我提到我使用虚拟主机的原因是我怀疑是导致问题的原因。但也许我错了。
答案 0 :(得分:3)
实际的主力是一个名为mod_rewrite
的模块,它允许您设置重写规则以将URL重定向到index.php进行处理。
See this article for some more in depth details on how to go about this
看起来你正在使用的重写条件有点遵循旧规则。
我认为你遗失的两件事(其中一件不相关,但有帮助)是:
RewriteBase
- 我发现指定重写基础可以帮助您的规则更好地运作。从技术上讲,我认为它应该可行,但除了没有它之外我什么也没遇到。RewriteCond
排除实际文件的语句 - 现在您的条件会掩盖很多真实文件,这可能不是您想要的。那我们该如何解决这个问题?
RewriteBase /
这会将重写引擎的根目录设置为在.com/
之后启动,这简化了事情,因为你不需要处理领先的/.
因此,您需要将主要重写规则更改为:
RewriteRule ^(.*)$ index.php/$1 [L]
这会将.com/anything/you/type
重定向到.com/index.php/anything/you/type
,php脚本可以自动选择它以传递给路由器。
这依赖于条件但是因为否则你最终会进入循环,所以在这一行之上你需要这些条件来防止隐藏实际的文件/文件夹:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
这个!-f
表示“Not -f”,其中-f表示“是一个文件”,-d表示“是一个目录”,所以基本上你说的只是当{ {1}}不是文件,也不是目录。
然后任何指向实际文件的url都会解决得很好! (包括index.php)。
所以.htaccess中有以下几行,你应进行适当的重写:
%{REQUEST_FILENAME}
如果您在apache配置中启用了mod_rewrite,那么您应该很高兴。
如果你在Ubuntu上使用Apache2,启用它的命令是微不足道的:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
实际上,模块实际启用了您的apache中的所有a2enmod rewrite
service apache2 reload
规则将无法执行。
如果仍然无法正常工作,您需要检查apache主配置,看看.htaccess文件中是否允许有一部分命令,通常安装设置为Rewrite*
,这样任何事情都可以在那里指定,但通常它被锁定以防止客户之间的安全重叠。你提到你正在使用VPS,所以你可能不必这样做,但我想我会为了别人的缘故而提及它。
您要寻找的选项如下:
All
最后一件事主要是安全网:
Apache提供了一种针对现有模块的gaurd子句的方法
AllowOverride All
好的,我刚注意到虚拟主机。我认为问题是您在<IfModule mod_rewrite.c>
~~ Put Rewrite* Rules here ~~
</IfModule>
块中放置了重写条件,并且它们需要存在于您文件所在文件夹的<VirtualHost >
块中。
您可以通过删除conf中的所有<Directory>
规则并将其添加到.conf文件中来执行此操作:
Rewrite*
或者在<Directory /var/www/codeigniter>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</Directory>
中添加.htaccess
文件,其中包含以下内容:
/var/www/codeigniter
这些规则适用于目录,而不是VHost声明,而.htaccess基本上是RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
块的快捷方式。
有用的链接: