nginx referer 防盗链需在 location 块内用 valid_referers 配合 if($invalid_referer) return 403 实现,白名单须含协议端口,空 referer 要显式加 none,规则应置于 #rewrite-end 下或 ssl 段内防覆盖。

Referer 防盗链在 Nginx 里怎么写才生效
宝塔面板只是生成配置的工具,真正起作用的是 Nginx 的 valid_referers 指令。很多人配完没效果,不是面板问题,而是规则写法或位置错了。
关键点:防盗链规则必须放在 location 块里,且要覆盖到被保护的资源路径(比如图片、视频、JS/CSS),不能只写在 server 根部。
-
valid_referers只做匹配判断,不自动拦截;得配合if ($invalid_referer)+return 403或重定向才能生效 - 空 Referer(直接地址栏访问)默认不通过,如需允许,得显式加上
none - 域名匹配支持通配符
*,但只支持开头或结尾,比如*.example.com或example.*,不支持中间通配
location ~* \.(jpg|jpeg|png|gif|webp|js|css)$ {
valid_referers none blocked *.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
}
宝塔里改哪几个地方才不会被覆盖
每次在宝塔「网站设置」→「配置文件」里手动加规则,保存后看似生效,但一旦点「重载配置」或修改 SSL、伪静态等,就可能被面板自动重写覆盖。
根本办法是把防盗链逻辑放进「配置文件」的固定锚点位置,而不是随便粘贴。
- 找到配置文件中
#SSL-START和#SSL-END之间的空白处,或者#REWRITE-END下方 - 优先写在
location块内部,避免放在server块顶层——Nginx 不允许valid_referers在 server 级直接使用 - 如果用了多站点共用一个配置(如反向代理场景),确认规则作用域没跨错 host
常见 403 却不是防盗链导致的误判
配完一刷新图片全 403,第一反应是规则太严,但更可能是其他环节出问题。
- 浏览器开发者工具 Network 面板里看具体请求的
Referer字段值,注意大小写和末尾斜杠(https://a.com/≠https://a.com) - 某些前端框架(如 Vue Router history 模式)或 PWA 应用会触发空 Referer,此时若没加
none就会拦截 - CDN 或代理层(如 Cloudflare)可能清空或改写 Referer,需检查 CDN 是否开启「Preserve Origin Headers」
- 本地测试时用 file:// 协议打开 HTML,Referer 为空且被浏览器策略禁止发送,不属于线上真实场景,别拿它验证
为什么有时候加了白名单还是 403
最常忽略的是协议和端口不一致。Nginx 的 valid_referers 匹配的是完整 Referer URL,包括协议、域名、端口(如有)。
-
https://mydomain.com和http://mydomain.com是两个不同源,必须都列出来 - 开发环境用
localhost:8080调试,白名单就得写localhost或localhost:8080,不能只写域名 - 微信内置浏览器、QQ 浏览器等会伪造 Referer,值可能是
https://servicewechat.com/...,这种无法靠白名单解决,得换方案(如 Token 鉴权)
复杂点在于 Referer 是客户端可篡改的,纯靠它防不了专业爬虫,只能拦住大部分盗链链接和简单采集。真要保资源,得结合签名 URL 或登录态校验。











