Apache2.4 Host Header注入/重定向问题:非指定Host请求仍响应求助
解决Apache 2.4.41中非法Host头请求响应的问题
有效解决方案
方案1:配置优先级最高的Catch-All虚拟主机(推荐)
Apache会将第一个加载的匹配端口的虚拟主机作为默认主机,因此需将Catch-All配置放在自定义域名虚拟主机之前,同时必须处理443端口的SSL握手(否则请求在握手阶段失败,无法触发拦截规则)。
创建000-catchall.conf配置文件(确保文件名排序在你的自定义配置之前,比如自定义配置为001-xyz.conf),内容如下:
<VirtualHost *:443> ServerName _default_ ServerAlias * # 443端口必须启用SSL,可复用现有证书或使用自签证书 SSLEngine On SSLCertificateFile /etc/apache2/ssl/cert/some.crt SSLCertificateKeyFile /etc/apache2/ssl/private/somekey.pem # Apache 2.4 使用Require语法替代旧版Order/Deny <Location /> Require all denied </Location> # 可选:记录非法请求日志 ErrorLog /var/www/logs/catchall_error.log CustomLog /var/www/logs/catchall_access.log combined </VirtualHost>
重启Apache生效:
sudo systemctl restart apache2
方案2:在自定义虚拟主机内添加严格Rewrite拦截规则
在xyz.somedomain.com的虚拟主机配置中,添加以下规则(确保已启用mod_rewrite):
RewriteEngine On # 匹配所有非目标域名的Host头(忽略大小写) RewriteCond %{HTTP_HOST} !^xyz\.somedomain\.com$ [NC] # 返回403 Forbidden RewriteRule ^ - [L,F]
方案3:修正Apache 2.4的指令配置
调整
<If "%{HTTP_HOST} != 'xyz.somedomain.com'"> Require all denied </If>
此前配置无效的原因
- Catch-All配置问题:未设置
ServerName _default_或ServerAlias *,且加载顺序晚于自定义主机,导致Apache优先匹配你的业务虚拟主机;同时443端口未配置SSL,握手失败后无法触发拦截逻辑。 - Rewrite规则问题:正则表达式
^.(.*)错误,应使用^匹配所有路径;且误用%{SERVER_NAME}(对应虚拟主机配置的固定域名),需改用%{HTTP_HOST}获取请求的Host头。 指令问题 :此前配置未使用Apache 2.4标准的Require语法,若未启用mod_access_compat模块,旧版Deny from all规则会失效。
内容的提问来源于stack exchange,提问作者Akshay Sharma
相关产品推荐
相关产品推荐

