referer 检查不可靠,因浏览器和攻击者可随意伪造;仅适合防盗链和省带宽,不能作安全边界,需配合空 referer 放行、大小写统一、正则锚定及 cdn/签名等多重措施。

为什么直接用 Referer 检查不可靠
浏览器可随意伪造 Referer 请求头,攻击者用 curl 或脚本发个 -H "Referer: https://your-site.com" 就能绕过。Apache 的 mod_rewrite 做的 Referer 判断只是第一道门槛,不能当安全边界用,只适合防懒人盗链和减少带宽浪费。
常见错误现象:403 误杀(比如微信内嵌页、某些 RSS 阅读器、PWA 离线访问时 Referer 为空)、HTTPS 页面引用 HTTP 资源导致 Referer 被浏览器截断(Referrer Policy 默认行为)。
- 空
Referer必须显式放行,否则站内直接访问图片也会 403 - 子域名不自动匹配,
example.com不等于www.example.com,得单独列 - 移动端 WebView、微信、钉钉等环境常清空或改写
Referer,别一刀切屏蔽
RewriteCond %{HTTP_REFERER} 的写法陷阱
正则必须锚定开头和结尾,否则 evil.com/your-site.com/image.jpg 这类恶意拼接也能匹配成功。Apache 默认不区分大小写,但 Referer 值本身可能含大小写混合,建议统一转小写再比对。
推荐写法(放在 <directory></directory> 或站点配置中):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?your-domain\.com/ [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]
-
!^$放在最前,允许空 Referer(站内直链、书签访问、某些 HTTPS→HTTP 场景) -
https?://同时兼容 HTTP 和 HTTPS 来源 -
[NC]必加,避免因大小写不一致误拦截 - 不要用
.*your-domain\.com,必须用^和/锚定,防止域名后缀被冒用
如何让合法第三方平台(如微信、微博)也能正常加载
微信内置浏览器通常不带 Referer,微博卡片预览可能用特定 UA + 空 Referer 请求图片。硬性依赖 Referer 会导致分享失效。更务实的做法是:白名单 + 补充校验。
- 把已知合规平台的 User-Agent 加进条件(如
RewriteCond %{HTTP_USER_AGENT} !WeChat),但注意 UA 也可伪造 - 对关键资源(如商品图)用带签名的临时 URL 替代静态路径,例如
/img/123.jpg?token=abc123&exp=171xxxxxx,服务端校验签名和时效 - 图片资源尽量走 CDN,并在 CDN 层做 Referer 过滤(如 Cloudflare 的
Hotlink Protection),减轻 Apache 压力
验证是否生效及常见失效原因
用 curl -H "Referer: https://bad-site.com" 测试返回是不是 403;用 curl -H "Referer:" 测试空 Referer 是否放行。如果始终 403 或始终放行,大概率是规则顺序或作用域错了。
- 规则必须放在
RewriteEngine On之后,且位于正确作用域(<virtualhost></virtualhost>或<directory></directory>内) - 如果用了
AllowOverride None,.htaccess 里的规则不会生效,必须写在主配置里 - Apache 2.4+ 中,
mod_rewrite默认启用,但某些精简版系统可能未加载,检查a2enmod rewrite并重启 - CDN 缓存了旧响应?先清 CDN 缓存,再用
curl -v看原始响应头中的X-Cache或Age
真正难的不是写几行 RewriteRule,而是判断哪些流量该拦、哪些该放——这得看日志里真实 Referer 分布,而不是靠脑补白名单。









