实际的主力是一个名为 的模块mod_rewrite
,它允许您设置重写规则以将 url 重定向到 index.php 进行处理。
有关如何进行此操作的更多详细信息,请参阅本文
更新:
看起来您使用的重写条件有点遵循旧规则。
我认为您缺少的两件事(其中一件不相关,但很有帮助)是:
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
意味着“非-f”,其中-f 表示“是文件”,-d 表示“是目录”,所以基本上你是说只有在%{REQUEST_FILENAME}
不是文件且不是目录时才匹配此规则.
然后任何指向实际文件的 url 都可以正常解析!(包括 index.php)。
因此,使用 .htaccess 中的以下行,您应该得到正确的重写:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
如果你在你的 apache 配置中启用了 mod_rewrite,你应该很高兴。
如果您在 Ubuntu 上使用 Apache2,启用此功能的命令很简单:
a2enmod rewrite
service apache2 reload
重要的是,该模块实际上已启用Rewrite*
您的 apache 中的所有规则都不会执行。
如果这仍然不起作用,您需要检查 apache 主配置以查看 .htaccess 文件中是否允许使用命令子集,通常安装设置为All
可以在其中指定任何内容,但通常它被锁定以防止客户之间的安全重叠。您提到您正在使用 VPS,因此您可能不必执行此步骤,但我想我会为了其他人而提及它。
您要查找的选项如下所示:
AllowOverride All
最后一件事主要是一个安全网:
Apache 提供了一种方法来保护现有模块的子句
<IfModule mod_rewrite.c>
~~ Put Rewrite* Rules here ~~
</IfModule>
更新 2
好的,我刚刚注意到虚拟主机。我认为问题在于您将重写条件放在<VirtualHost >
块中,并且它们需要存在于<Directory>
文件所在文件夹的块中。
您可以通过Rewrite*
从您的 conf 中删除所有规则并将其添加到您的 .conf 文件中来做到这一点:
<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
:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
这些规则适用于目录,而不是 VHost 声明,并且 .htaccess<Directory>
基本上是块的快捷方式。
有用的链接: