14

在 Linux 系统上使用 Apache2 有没有办法使用mod_vhost_alias拥有多个 VirtualDocumentRoot ?

这是我目前正在使用并希望继续使用的命名约定:

host                    directory
127.0.0.1 domain        domain.com
127.0.0.1 sub.domain    domain.com_sub

然后在 httpd.conf 的 vhosts 部分中,我有:

NameVirtualHost 127.0.0.1

<VirtualHost 127.0.0.1>
    VirtualDocumentRoot /var/www/%0.0.com
</VirtualHost>

<VirtualHost 127.0.0.1>
    VirtualDocumentRoot /var/www/%2.0.com_%1
</VirtualHost>

问题是当我访问 sub.domain 时,Apache 错误日志显示它正在寻找 /var/www/sub.domain.com 而不是 /var/www/domain.com_test 这让我相信它只读取第一条规则然后失败,但我想做的是使用任何满足两个 VirtualDocumentRoot 规则中的任何一个的文档根。

4

5 回答 5

14

Apache 通常会选择与HTTP 标头中提供的主机ServerNameServerAlias匹配的第一个虚拟主机。Host在您的情况下,由于您没有ServerName指令,因此 Apache 应该使用 IP 地址上的反向 DNS 查找来伪造服务器名称,并假设反向 DNS 导致 domain.com 不匹配,然后 Apache 默认为第一个虚拟主机。听起来很复杂,我知道...底线是,您应该使用ServerNameServerAlias明确配置。尝试更多类似的东西:

NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>
    ServerName domain.com
    ServerAlias www.domain.com
    VirtualDocumentRoot /var/www/%0
</VirtualHost>
<VirtualHost 127.0.0.1>
    ServerName sub.domain.com
    ServerAlias *.domain.com
    VirtualDocumentRoot /var/www/%2.%3_%1
</VirtualHost>

这应该/var/www/domain.com用于http://domain.comhttp://www.domain.com/var/www/www.domain.com,这两者都由第一个虚拟主机提供服务,对于http://sub.domain.com,用于http:// blah.domain.com等等。/var/www/sub.domain.com/var/www/blah.domain.com

于 2009-02-15T09:16:48.590 回答
4

当你想放一个“。”时,你必须限定反向引用。在文件路径中。所以你需要这样:

VirtualDocumentRoot /var/www/%2.0.%3_%1
于 2010-07-30T05:23:27.620 回答
2

关于 OP 和设置“/var/www/html”的问题:

我遇到的问题是使用 %1 而不是 %2。这是我的工作示例:

ServerAlias www.*.org.au
UseCanonicalName Off
VirtualDocumentRoot /path/to/sites/%2/pub

希望对某人有所帮助!

我在mod_vhost_alias docs中阅读了有关“目录名称插值”的文档。

于 2010-03-24T07:26:30.420 回答
1

我终于找到了一个允许灵活创建子域的配置。

请参阅mod_vhost_alias上的 apache 文档

如果您的根开发域有 3 个部分,例如 dev.example.com,您可以将%-4+其用作根域之前所有内容的占位符。如果它有 4 个部分,请使用%-5+.

<VirtualHost *:80>
    VirtualDocumentRoot "/var/www/%-4+/webroot"
    ServerName www.dev.example.com
    ServerAlias *.dev.example.com
    php_admin_value auto_prepend_file /var/www/setdocroot.php
</VirtualHost>

这样,您可以创建一个名为的目录/var/www/sub.domain/webroot并使用 url 访问它sub.domain.dev.example.com

该行php_admin_value auto_prepend_file /var/www/setdocroot.php修复了某些系统(如 OSX 10.9+)上的 docroot

以下是 的内容setdocroot.php

<?php
$_SERVER['DOCUMENT_ROOT'] = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['SCRIPT_FILENAME']);
?>
于 2015-06-01T13:05:52.930 回答
0

我注意到这个配置是 $_SERVER['DOCUMENT_ROOT'] 指向 /var/www/html 而不是虚拟主机的文档根目录。诡异的。

更新(2010-07-24):

我刚刚写了一篇博客文章如何设置您的 http 证明服务器 http://www.devcha.com/2010/07/how-to-setup-your-http-proof-server.html

于 2010-02-16T17:28:00.997 回答