referer检查本质是弱验证机制,不可用于安全边界,仅适合防懒人盗链和省带宽;需放行空referer、锚定正则、大小写不敏感,并配合cdn、签名url等多重措施。

Apache 中的 Referer 检查本身无法做到“严格”安全,它本质是弱验证机制——浏览器可清空、客户端可伪造、HTTPS→HTTP 跳转会截断,因此不能用于权限控制或防下载。但作为第一道轻量级流量过滤,配合合理写法和多层补充,能有效减少懒人盗链和带宽浪费。
基础配置:避免常见误杀与绕过
以下规则应放在 <directory></directory> 块、虚拟主机配置或 .htaccess 中(确保 mod_rewrite 已启用):
- 必须放行空 Referer:站内直接访问图片、书签打开、微信/钉钉 WebView、PWA 离线页等场景常无 Referer,不加这行会导致大量 403
-
协议与子域显式覆盖:用
https?://(www\.)?your-domain\.com/同时兼容 http/https 和 www/non-www;example.com不匹配api.example.com,需单独添加 -
正则必须锚定:开头用
^、结尾用/(或$),防止hacker-site.com/your-domain.com/image.jpg这类拼接绕过 -
强制大小写不敏感:加上
[NC],避免因Your-Domain.com或YOUR-DOMAIN.COM导致拦截
示例:
RewriteEngine On<br>RewriteCond %{HTTP_REFERER} !^$<br>RewriteCond %{HTTP_REFERER} !^https?://(www\.)?your-domain\.com/ [NC]<br>RewriteCond %{HTTP_REFERER} !^https?://(www\.)?cdn\.your-domain\.com/ [NC]<br>RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]
高并发优化:改用 mod_setenvif 提升性能
当图片目录 QPS 较高(如 >100),mod_rewrite 的正则引擎会成为瓶颈。推荐用更轻量的 mod_setenvif 替代:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 用
SetEnvIfNoCase Referer做前缀/后缀快速匹配,不触发重写流程,CPU 占用更低 - 搭配
<filesmatch></filesmatch>实现资源粒度控制,比全局 Rewrite 更精准 - Apache 2.4+ 请使用
Require语法替代已废弃的Order Deny,Allow
示例(Apache 2.4):
SetEnvIfNoCase Referer "^https?://(www\.)?your-domain\.com/" good_referrer<br>SetEnvIfNoCase Referer "^https?://(www\.)?cdn\.your-domain\.com/" good_referrer<br><br><filesmatch><br> Require env good_referrer<br> Require all denied<br></filesmatch>
应对真实业务场景:微信、微博、CDN 等兼容方案
硬性依赖 Referer 会导致分享失效、小程序白屏、CDN 回源异常等问题,需务实补充:
-
微信内嵌浏览器默认不发 Referer,可结合 User-Agent 白名单临时放行(如
RewriteCond %{HTTP_USER_AGENT} !WeChat),但注意 UA 可伪造,仅作辅助 -
关键图片改用签名 URL:如
/img/abc.jpg?token=sha256(xxx)&exp=171xxxxxx,服务端校验签名与时效,彻底规避 Referer 依赖 - 图片尽量走 CDN,在 CDN 层(如 Cloudflare、阿里云 DCDN)开启 Hotlink Protection,减轻 Apache 压力,且支持泛域名白名单、Referer 透传等高级能力
验证与排错要点
别只看浏览器表现,用命令行真实模拟各类请求:
- 测试盗链:
curl -H "Referer: https://bad-site.com" https://your-domain.com/test.jpg→ 应返回 403 - 测试空 Referer:
curl -H "Referer:" https://your-domain.com/test.jpg→ 应返回 200(若你允许直链) - 测试 HTTPS→HTTP 场景:
curl --http1.1 -k https://your-domain.com/page.html中引用 HTTP 图片,观察 Referer 是否被清空 - 检查 Apache 错误日志:
tail -f /var/log/apache2/error.log,确认规则是否被加载、有无正则语法错误










