Apache2按Referer拦截域名无效,请求仍正常响应求助
解决Apache2按Referer拦截特定域名无效的问题
先修正你的.htaccess规则
现有RewriteCond存在冗余且可能包含语法错误,直接简化并修正:
<IfModule mod_rewrite.c> RewriteEngine On # 匹配所有包含example.com的Referer(含子域名、带/不带结尾斜杠、带/不带https) RewriteCond %{HTTP_REFERER} example\.com [NC] RewriteRule ^ - [F,L] </IfModule>
说明:
[NC]忽略大小写,覆盖所有大小写形式的example.com- 单个条件即可匹配所有目标Referer格式,无需拆分多个
OR条件 - 半角
-表示不重写URL,直接返回403 Forbidden(注意原规则中的破折号如果是全角会导致失效)
排查.htaccess是否生效
- 检查Apache站点配置(如
apache2.conf或000-default.conf)中,网站根目录的AllowOverride设置是否为All,默认可能是None导致.htaccess不生效:
找到对应<Directory>块,确保配置如下:<Directory /var/www/html> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> - 修改后重启Apache:
systemctl restart apache2
其他排查方向
- 验证实际接收的Referer:虽然access.log显示有Referer,但请求可能被代理篡改。可临时添加自定义日志确认:
在站点配置中添加:
重启后查看该日志,确认实际收到的Referer和access.log记录一致。LogFormat "%h %{Referer}i" referer_debug CustomLog /var/log/apache2/referer_debug.log referer_debug - 检查规则冲突:如果
default-ssl.conf或其他配置文件中有Rewrite规则,可能覆盖.htaccess的设置。可将拦截规则直接写入站点配置文件(优先级高于.htaccess),或确认RewriteOptions inherit生效。 - 模拟请求测试:用
curl模拟带指定Referer的请求,验证规则是否生效:
返回403则规则生效,返回200则继续排查配置。curl -I -H "Referer: https://example.com/" https://你的域名/public/file.txt - 查看错误日志:检查
/var/log/apache2/error.log,确认是否存在.htaccess语法错误、模块加载异常等提示。
内容的提问来源于stack exchange,提问作者omega1
相关产品推荐
相关产品推荐

