Apache默认虚拟主机与通配符端口匹配问题咨询
我希望用Apache的_default_虚拟主机匹配所有未通过ServerName/ServerAlias明确定义的请求,比如访问服务器IPhttp://123.123.123.123或http://test.mysite.tld这类场景。
符合预期的匹配示例
以下配置能正常实现预期效果,但要求默认虚拟主机和已定义虚拟主机的端口模式完全一致(同为:80或:*):
# 此配置可正确匹配未定义的test.mysite.tld,需与第二个虚拟主机均指定:80端口 <VirtualHost _default_:80> DocumentRoot /var/www/html/default </VirtualHost> # 此配置仅匹配mysite.tld和www.mysite.tld,不匹配test.mysite.tld,需与第一个虚拟主机均指定:80端口 <VirtualHost *:80> ServerName mysite.tld ServerAlias www.mysite.tld DocumentRoot /var/www/html/mysite.tld </VirtualHost>
不符合预期的异常场景
当默认虚拟主机使用通配符端口_default_:*,而已定义虚拟主机指定:80端口时,访问http://test.mysite.com会匹配第二个虚拟主机,与预期不符:
# 使用通配符端口的默认虚拟主机,预期匹配所有未定义请求,但实际未生效 <VirtualHost _default_:*> DocumentRoot /var/www/html/default </VirtualHost> # 预期该配置仅匹配mysite.tld和www.mysite.tld,但实际会匹配未定义的test.mysite.tld <VirtualHost *:80> ServerName mysite.tld ServerAlias www.mysite.tld DocumentRoot /var/www/html/mysite.tld </VirtualHost>
疑问
我猜测_default_仅能匹配端口模式完全一致的未定义请求,但这样的话_default_:*通配符端口的意义是什么?另外虚拟主机的顺序对此没有影响,只要默认主机是_default_:*、已定义主机是*:80,未定义的http://test.mysite.tld就始终匹配*:80主机而非默认主机。
Apache官方文档相关内容(中文翻译)
Apache 2.4官方文档中关于默认虚拟主机的说明:
默认虚拟主机是指当客户端请求无法匹配任何已定义的
ServerName或ServerAlias时,会被匹配的虚拟主机。如果没有显式指定_default_虚拟主机,配置文件中第一个出现的虚拟主机会被当作默认主机。
当使用_default_时,它仅会匹配与自身端口模式完全匹配的请求。也就是说,_default_:*只会匹配那些没有对应特定端口虚拟主机的请求;如果存在针对:80端口的虚拟主机,所有80端口的请求(包括未匹配ServerName的)都会优先匹配该:80端口的虚拟主机,不会落到_default_:*上。
内容的提问来源于stack exchange,提问作者adrianTNT

