【问题标题】:Infinite loop on combination of RewriteRulesRewriteRules 组合的无限循环
【发布时间】:2011-03-29 09:32:38
【问题描述】:

所以我在我的家庭服务器 (Ubuntu 9.1) 上设置 SVN,并希望能够立即查看对我的 CodeIgniter 应用所做的任何更改。

所以,我的工作副本位于 /home/myname/environments/development/appname。

可以通过 dev.appname.myname.ca 访问我的 Vhost,配置如下所示:

 DocumentRoot /home/myname/environments/development/
 ServerName dev.myname.ca
 ServerAlias dev.*.myname.ca

 RewriteEngine On
 RewriteCond %{HTTP_HOST} !^www.* [NC]
 RewriteCond %{HTTP_HOST} ^dev.([^\.]+)\.myname\.ca
 RewriteCond /home/myname/environments/development/%1/trunk/ -d
 RewriteRule ^(.*) /%1/trunk/public/$1

因此,转到 dev.appname.myname.ca 将指向 /home/myname/environments/development/appname/trunk/public。

现在,这是一个 CodeIgniter 应用程序,我需要将所有请求从 public/ 重定向到 public/index.php,因此 public/ 中的 .htaccess 文件如下:

RewriteEngine On
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php/$1 [L]

我将这部分放在 .htaccess 文件中,因为在实时生产站点上,我无法访问服务器配置,因此我需要覆盖它。

现在的问题是我得到一个重定向循环,最终出现 500 错误。

来自 /var/log/apache2/error.log:

redirected from r->uri = /appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/appname/trunk/public/index.php/

如何将请求重定向到正确的 public/ 目录(在本例中为 /home/myname/environments/development/appname/trunk/publc),然后将所有请求从 public/ 定向到 public/index.php?

我知道这是一个冗长的问题 - 感谢您的帮助。 :)

【问题讨论】:

    标签: apache codeigniter loops mod-rewrite infinite


    【解决方案1】:

    您的 RewriteRule 与您实际想要的相反。

    RewriteRule ^(.*)$ index.php/$1 [L]
    

    这会将“dirA/dirB/dirC/”变成“index.php/dirA/dirB/dirC”。在随后的 HTTP 请求中,这将满足条件并再次应用该规则。一次又一次……

    试试:

    RewriteRule ^(.*)\/?$ $1/index.php [L]
    

    【讨论】:

    • 如果你这样做,CodeIgniter 将永远无法工作。 [L] 标志意味着它将重定向到 index.php 然后不再进行重定向。
    【解决方案2】:

    正如 Phil 提到的,你应该使用这里的重写规则 http://codeigniter.com/wiki/mod_rewrite/

    对于一些调试,您可以在 httpd.conf 或虚拟主机 conf 中添加以下行。

    <IfModule mod_rewrite.c>
    RewriteLog "/var/log/apache2/rewrite.log"
    RewriteLogLevel 3
    </IfModule>
    

    tail -f /var/log/apache2/rewrite.log
    

    您可以检查重写规则和一些错误。您还可以将级别更改为 9。请注意此选项。它产生了大量的信息。它有时会很有帮助。

    【讨论】:

      【解决方案3】:

      尝试使用一些不那么疯狂的东西,你不需要从 public/ 重定向到 public/index.php,因为 Apache 会为你做这件事。

      CodeIgniter Wiki 展示了如何create the ultimate CodeIgniter .htaccess

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多