3

我为 /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 的关系?

4

1 回答 1

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

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

于 2012-11-14T03:49:49.570 回答