【问题标题】:Infinite loop with mod_rewrite and vhost_alias带有 mod_rewrite 和 vhost_alias 的无限循环
【发布时间】:2012-11-13 11:27:59
【问题描述】:

我为 /home/lukasz/websites 中的所有目录创建了一个动态 vhost 文件

<VirtualHost *:80>
        ServerName vm01.dev
        ServerAlias *.vm01.dev

        SetEnv APPLICATION_ENV "lukasz"

        VirtualDocumentRoot /home/lukasz/websites/%1/public
        <directory /home/lukasz/websites/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
        </directory>
</VirtualHost>

在 mod_rewrite 的非常简单的规则发挥作用之前,它运行良好。如果我将以下代码添加到 .htacesss

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

apache 服务器将无法响应。它将进入无限循环,并在 10 次重定向后退出执行。这个问题与我正在使用的 VirtualDocumentRoot 密切相关。我应该如何修改我的配置以使其保持动态并停止它与 htaccess 的关系?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    我猜你想让 index.php 成为默认页面,当请求的资源不存在时,你没有说。

    如果是这种情况,那么将 ErrorDocument 条目添加到您的 virtualHost 就足够了,例如

    ErrorDocument 404 /index.php
    

    如果您要使用 mod_rewrite,将规则放在 Virtualhost 定义中比放在 .htaccess 文件中要高效得多。由于 httpd.conf 在启动时读取一次并编译所有规则,而不是读取 .htaccess 文件并为每个请求解析所有规则。无论如何,以下应该停止循环:

    RewriteEngine On
    
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule .* /index.php [L]
    

    假设你有一个:/index.php

    仅供参考: Apache mod_rewrite 文档值得一读,如果您不清楚上述规则的作用,或者如果您想要更抽象的内容,请考虑以下 post

    【讨论】:

    • 一个解释会很好。为什么该示例有效,但 OP 无效?唯一阻止我投反对票的是,提供的示例解决了我的问题。不知道为什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多