mod_rewrite和vhost_alias的无限循环

时间:2012-11-13 11:27:59

标签: apache .htaccess mod-rewrite

我为/ home / lukasz / sites

中的所有目录创建了一个动态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来阻止它?

1 个答案:

答案 0 :(得分:0)

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

如果是这种情况,那么在 virtualHost 中添加 ErrorDocument 条目就足够了。

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

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