使用Vhost去掉codeigniter中的index.php

时间:2012-10-19 17:44:58

标签: .htaccess codeigniter

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

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

1 个答案:

答案 0 :(得分:3)

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

See this article for some more in depth details on how to go about this

更新

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

我认为你遗失的两件事(其中一件不相关,但有帮助)是:

  1. RewriteBase - 我发现指定重写基础可以帮助您的规则更好地运作。从技术上讲,我认为它应该可行,但除了没有它之外我什么也没遇到。
  2. RewriteCond排除实际文件的语句 - 现在您的条件会掩盖很多真实文件,这可能不是您想要的。
  3. 那我们该如何解决这个问题?

    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 
    

    更新2

    好的,我刚注意到虚拟主机。我认为问题是您在<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] 块的快捷方式。

    有用的链接