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
实际上是在<VirtualHost>
之外使用,我们可以通过在内部使用来限制它。【参考方案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 声明?