VirtualDocumentRoot、.htaccess 和 mod_rewrite 的无限循环

VirtualDocumentRoot、.htaccess 和 mod_rewrite 的无限循环

我想用 apache2 建立强大的多用户开发环境。

所以我将以下文件放到etc/apache2/sites-available/mydomain.com

<virtualhost *:80>
    ServerName  mydomain.com
    ServerAlias www.mydomain.com
    DocumentRoot /var/www/mydomain.com/prod
</virtualhost>

<virtualhost *:80>
    VirtualDocumentRoot /var/www/mydomain.com/%1
    ServerName dev.mydomain.com
    ServerAlias *.dev.mydomain.com
</virtualhost>

并将以下.htaccess文件复制到各个/var/www/mydomain.com/*目录:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L,NS]

最后,它对于像这样的请求工作正常http://mydomain.com/,但对于则不然http://mydomain.com/foo

Request exceeded the limit of 10 internal redirects due to probable configuration error.
Use 'LimitInternalRecursion' to increase the limit if necessary.
Use 'LogLevel debug' to get a backtrace.
[debug] core.c(3112): r->uri = /var/www/mydomain.com/foo/index.php
[debug] core.c(3118): redirected from r->uri = /var/www/mydomain.com/foo/index.php
[debug] core.c(3118): redirected from r->uri = /foo

那么我该如何修复这个问题以及出了什么问题?

答案1

一个常见的误解是重写规则应该放在 .htaccess 文件中。但事实并非如此。实际上,将重写规则放在那里是个坏主意。

您可以访问您的服务器配置。您应该将您的规则放在那里(如果您选择使用任何...)

但是,对于“将未找到的所有内容重定向到 index.php”的问题,有一个更好的解决方案。这就是使用 fallbackresource:

http://httpd.apache.org/docs/2.2/mod/mod_dir.html#fallbackresource

<virtualhost *:80>
    VirtualDocumentRoot /var/www/mydomain.com/%1
    ServerName dev.mydomain.com
    ServerAlias *.dev.mydomain.com
    FallBackResource /index.php
</virtualhost>

相关内容