如何配置Apache站点仅接受指定Host头请求,阻止IP直接访问
基于Apache拦截非指定域名Host请求的配置方法
前置要求
- 使用默认虚拟主机方案无需额外启用模块,使用重写方案需要提前启用
mod_rewrite模块 - 你拥有站点Apache配置的编辑权限
方案一:默认虚拟主机拦截(推荐,性能最优)
Apache匹配虚拟主机时会按配置文件中的顺序优先匹配第一个声明的同端口虚拟主机,所有Host字段未匹配到对应站点域名的请求都会进入默认虚拟主机,直接对默认虚拟主机全局禁止访问即可实现拦截。
操作步骤:
- 打开Apache虚拟主机配置文件,常见路径:
- CentOS/RHEL 系列:
/etc/httpd/conf.d/目录下的虚拟主机配置文件,通常命名为vhost.conf或者00-default.conf - Debian/Ubuntu 系列:
/etc/apache2/sites-available/000-default.conf
- CentOS/RHEL 系列:
- 将如下默认虚拟主机配置放在所有自定义站点虚拟主机的最前面:
<VirtualHost *:80> ServerName default-catch-all <Location /> Require all denied </Location> # 可选:配置自定义错误页面 # ErrorDocument 403 /custom_403.html </VirtualHost>
- 后续按原有逻辑配置你自己的站点虚拟主机,示例如下:
<VirtualHost *:80> ServerName yourdomain.com ServerAlias www.yourdomain.com DocumentRoot /var/www/your_site_root <Directory /var/www/your_site_root> AllowOverride All Require all granted </Directory> # 其余原有站点配置保持不变 </VirtualHost>
- 如果你开启了HTTPS,需要对443端口也配置同样的默认拦截虚拟主机,放在所有443端口站点虚拟主机的最前面。
方案二:Rewrite规则拦截(适合无法调整虚拟主机配置顺序的场景)
操作步骤:
- 首先启用
mod_rewrite模块:- Debian/Ubuntu 执行命令:
a2enmod rewrite - CentOS/RHEL 编辑
/etc/httpd/conf/httpd.conf,去掉LoadModule rewrite_module modules/mod_rewrite.so前的注释
- Debian/Ubuntu 执行命令:
- 在站点的
.htaccess文件或者站点虚拟主机的Directory配置块中添加如下规则:
RewriteEngine On # 将示例域名替换为你的实际域名,多个域名用|分隔,例如:!(yourdomain\.com|seconddomain\.com)$ RewriteCond %{HTTP_HOST} !^(www\.)?yourdomain\.com$ [NC] RewriteRule ^ - [F,L]
规则说明:
%{HTTP_HOST}对应请求头的Host字段!表示匹配不到后续规则时执行重写逻辑[NC]表示匹配时不区分大小写[F]表示返回403禁止访问状态码[L]表示终止执行后续重写规则
配置生效验证
- 先检查配置语法是否正确:
apachectl configtest,返回Syntax OK再执行重启操作 - 重启Apache服务:
- CentOS/RHEL:
systemctl restart httpd - Debian/Ubuntu:
systemctl restart apache2
- CentOS/RHEL:
- 验证效果:直接输入服务器IP访问,返回403错误;使用你的域名访问站点功能正常,即为配置生效。
内容的提问来源于stack exchange,提问作者yaseen
相关产品推荐
相关产品推荐

