Apache 2.4的大规模虚拟主机

时间:2014-06-20 10:01:22

标签: apache mod-rewrite virtual-hosts mod-vhost-alias

我想在VirtualDocumentRoot中使用RewriteRule设置的值。

Apache documentation说:

  

要确定的另一件事是文档根(使用DocumentRoot配置并通过DOCUMENT_ROOT环境变量可用于CGI脚本)。在正常配置中,核心模块在将URI映射到文件名时使用它,但是当服务器配置为执行动态虚拟主机时,该作业必须由另一个模块(mod_vhost_alias或mod_rewrite)接管,该模块具有不同的做映射的方式。这些模块都不负责设置DOCUMENT_ROOT环境变量,因此如果任何CGI或SSI文档使用它,它们将获得误导性值。

参考文档,我似乎无法在%{DOCUMENT_ROOT}中使用RewriteRule。但在寻找替代解决方案之后,我发现ticket(标题: DOCUMENT_ROOT环境变量与VirtualDocumentRoot错误地设置)说它已经“在2.4.1中修复”。

我正在使用最新的(稳定版)Apache:

$ httpd -v
Server version: Apache/2.4.9 (Unix)
Server built:   Jun 18 2014 03:07:48

......但它似乎对我不起作用。测试时,%{DOCUMENT_ROOT}具有httpd.conf中DocumentRoot设置的默认值。我希望%{DOCUMENT_ROOT}(或我可以使用的任何其他变量)由VirtualDocumentRoot动态设置。

以下是我想在httpd-vhosts.conf中使用的内容:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

有解决方案吗?

1 个答案:

答案 0 :(得分:0)

在用@John Auld查看了许多方向后(感谢您的时间和帮助),我终于找到了解决方案。正如我在a previous comment所说的,它不是100%完美,但对我来说已经足够了。

为了清楚起见,这是我想在httpd-vhosts.conf中拥有的内容:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2+"

    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1" [P]
</VirtualHost>

以下是我提出的建议:

<VirtualHost *:8080>
    ServerName dev
    ServerAlias *.dev

    VirtualDocumentRoot "/usr/local/var/www/.dev/%-2/%-3"

    RewriteCond %{SERVER_NAME} (?:([^.]+)\.)?([^.]+)\.dev
    RewriteRule ^/(.*\.php(/.*)?)$ "fcgi://127.0.0.1:9000/usr/local/var/www/.dev/%2/${:%1|www}/$1" [P]
</VirtualHost>

我使用RewriteCond捕获%{SERVER_NAME}的部分内容,并在RewriteRule中重复使用。

有两个捕获组:子域(%1)和域(%2)。子域是可选的,因此我使用语法${map:value|default}为空子域设置默认值。

当部件(VirtualDocumentRoot)不可用时,

%N.M有自己的默认值。如documentation中所述:

  

如果N或M大于可用部件的数量,则插入单个下划线。

这就是为什么我不得不使用一些&#34;技巧&#34;使其适用于可选的子域:

ln -sfv /path/to/the/project/www /path/to/the/project/_

如果你想办法做到这一点&#34;只配置&#34;,留下评论,我会用你的贡献编辑我的答案。