Apache 2.2 忽略 VirtualDocumentRoot 虚拟主机?

Posted

技术标签:

【中文标题】Apache 2.2 忽略 VirtualDocumentRoot 虚拟主机?【英文标题】:Apache 2.2 ignoring VirtualDocumentRoot VirtualHosts? 【发布时间】:2010-10-21 14:53:54 【问题描述】:

我有几个域希望通过 mod_vhost_alias 启用通配符子域

在我的 httpd.conf 中包含以下通用规则:

<VirtualHost [ip here]:80>
    ServerName domain1.com
    ServerAlias www.domain1.com
    DocumentRoot /home/user1/public_html
</VirtualHost>
<VirtualHost [ip here]:80>
    ServerName *.domain1.com
    VirtualDocumentRoot /home/user1/subdomains/%-3+
</VirtualHost> 

<VirtualHost [ip here]:80>
    ServerName domain2.com
    ServerAlias www.domain2.com
    DocumentRoot /home/user2/public_html
</VirtualHost>
<VirtualHost [ip here]:80>
    ServerName *.domain2.com
    VirtualDocumentRoot /home/user2/subdomains/%-3+
</VirtualHost>

问题是 apache 完全忽略了带有通配符 ServerNames 的虚拟主机。对 test.domain1.com 或 test.domain2.com 的任何请求都只会显示 /home/user1/public_html 的内容(根据 apache 的默认规则)。

其他一些信息:

/home/user1/subdomains/test/home/user2/subdomains/test 都存在并且其中有文件

我的所有域都有一个在绑定配置中列出的通配符子域,它们指向 Vhost 规则中指定的相同 IP。子域的标准 Vhost 规则有效,但通配符无效。

httpd -S 输出的剪辑版

# httpd -S
虚拟主机配置:
[ip here]:80 是 NameVirtualHost
         默认服务器 domain1.com (/etc/httpd/sites/user1:1)
         端口 80 namevhost domain1.com (/etc/httpd/sites/user1:1)
         端口 80 namevhost *.domain1.com (/etc/httpd/sites/user1:14)
         端口 80 namevhost domain2.com (/etc/httpd/sites/user2:1)
         端口 80 namevhost *.domain2.com (/etc/httpd/sites/user2:14)
语法OK
# httpd -M
加载模块:
 核心模块(静态)
 mpm_prefork_module(静态)
 http_module(静态)
 so_module(静态)
 rewrite_module(共享)
 auth_basic_module(共享)
 authz_host_module(共享)
 包含模块(共享)
 log_config_module(共享)
 logio_module(共享)
 mime_magic_module(共享)
 mime_module(共享)
 vhost_alias_module(共享)
 dir_module(共享)
 suexec_module(共享)
 php5_module(共享)
 suphp_module(共享)
 ssl_module(共享)
语法OK

任何关于问题所在的建议将不胜感激。

【问题讨论】:

【参考方案1】:

我是个菜鸟,这是一个非常简单的解决方案。

ServerName 不允许使用通配符,但 ServerAlias 允许,所以我只是再次复制了服务器名。

这是任何碰巧找到此答案的域的最终最小化配置(当您在谷歌上搜索并找到问题但没有答案时,我讨厌它):

<VirtualHost [ip here]:80>
    ServerName domain1.com
    ServerAlias www.domain1.com
    DocumentRoot /home/user1/public_html
</VirtualHost>
<VirtualHost [ip here]:80>
    ServerName domain1.com #<-- The fix. Wildcards not supported in ServerName
    ServerAlias *.domain1.com
    VirtualDocumentRoot /home/user1/subdomains/%-3+
</VirtualHost>

【讨论】:

可以在 VirtualDocumentRoot 中使用通配符吗? 嗯,这是我不活跃的一个超级迟到的回复,你可能不会看到它,但也许其他人会。 是的,这就是 %-3+ 所做的,它从右边的第 3 部分(由点分隔)开始的所有内容以及它之前的所有内容。对于http://subsub.sub.domain1.com,它将使用/home/user1/subdomains/subsub.sub/ 作为它的documentroot。 @Kyle 和 Mike 实际上没有通配符(“***”),只是它的specific parameters 更像substr。另外我相信VirtualDocumentRoot实际上是在&lt;VirtualHost&gt;之外使用,我们可以通过在内部使用来限制它。【参考方案2】:

大卫,这个解决方案可以在成功时停止 mod_rewrite 循环,这将对您的问题有用)。

重写循环停止器:

重写条件 %ENV:REDIRECT_STATUS 200|[45]0[0-9] 重写规则 .* - [L]

【讨论】:

以上是关于Apache 2.2 忽略 VirtualDocumentRoot 虚拟主机?的主要内容,如果未能解决你的问题,请参考以下文章

Netcore 2.2 本地化路由 - 始终忽略默认区域性的路由值

xModRedirect 在 apache 2.2 与 apache 2.4 上的工作方式不同 如何在 2.2 上工作?

为啥 Apache 忽略我的 VirtualHost 声明?

Apache 忽略文档根目录

Apache 2.4 VirtualHost ServerName 被忽略

如何捕获和忽略 org.apache.catalina.connector.ClientAbortException