0

我已经尝试了我能找到的所有可能的 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 文件。

编辑:伙计们,我提到我使用虚拟主机的原因是我怀疑这是导致问题的原因。但也许我错了。

4

1 回答 1

3

实际的主力是一个名为 的模块mod_rewrite,它允许您设置重写规则以将 url 重定向到 index.php 进行处理。

有关如何进行此操作的更多详细信息,请参阅本文

更新:

看起来您使用的重写条件有点遵循旧规则。

我认为您缺少的两件事(其中一件不相关,但很有帮助)是:

  1. RewriteBase- 我发现指定重写基础对于帮助您的规则更好地工作有很长的路要走。从技术上讲,我认为它应该可以在没有它的情况下工作,但没有它我什么也没遇到。
  2. 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>基本上是块的快捷方式。

有用的链接

于 2012-10-19T17:51:58.107 回答