valid_referers 是 Nginx 防盗链核心指令,采用白名单机制匹配 Referer,支持精确域名、通配符、正则(需转义、锚定)及 none/block 等选项,须配合 if($invalid_referer) 使用;配置后需用 curl 和浏览器验证,并注意 Referrer Policy 与 referer 可伪造性,建议结合签名 URL 等多重防护。

要让 Nginx 文件服务器实现有效防盗链,valid_referers 指令是核心配置,它通过检查 HTTP 请求头中的 Referer 字段,判断请求是否来自合法来源。配置本身不难,但细节决定成败——比如空 referer 是否允许、正则匹配是否加锚点、大小写是否敏感等,稍有疏忽就可能导致误拦或失效。
理解 valid_referers 的匹配逻辑
valid_referers 不是“黑名单”,而是“白名单”机制:只有匹配到的 referer 才被视为合法,其余默认被拒绝(需配合 if 和 return 使用)。它支持多种匹配方式:
-
精确域名:如
valid_referers example.com;,仅匹配http://example.com/xxx(注意不带协议和路径) -
带协议的完整 host:如
valid_referers https://api.example.com;(Nginx 1.17.6+ 支持协议前缀) -
通配符:如
valid_referers *.example.com;,匹配所有子域(不含主域example.com) -
正则表达式:以
~开头,如valid_referers ~\.example\.(com|org)$;,注意需转义点号,推荐用$锚定结尾防误匹配 -
允许空 referer:必须显式写
none,例如valid_referers none example.com;,否则直接在浏览器地址栏输入图片 URL 会 403
典型防盗链配置写法
以下是一个兼顾安全与兼容的常用配置片段,放在 location 块中(如匹配图片、视频等静态资源):
location ~* \.(jpg|jpeg|png|gif|webp|mp4|pdf)$ {
valid_referers none blocked example.com *.example.com ~\.my\-cdn\.(com|net)$;
if ($invalid_referer) {
return 403;
# 或返回自定义提示图:rewrite ^/.*$ /images/forbidden.png break;
}
}说明:
-
blocked表示 referer 存在但被防火墙/隐私插件篡改(如变成空字符串或无协议域名),这类也放行较稳妥 - 正则中连字符
-需转义为\-,避免被当作范围符 - 不建议用
server_name变量替代域名字面量,因valid_referers不支持变量展开
调试与验证关键点
配置后务必验证,常见问题多源于 referer 匹配失败:
- 用
curl -H "Referer: https://evil.com" http://your.site/image.jpg模拟盗链请求,看是否返回 403 - 用浏览器直接访问资源 URL(此时 referer 为空),确认是否正常加载(依赖是否含
none) - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log,若出现no resolver defined提示,说明用了域名但未配resolver(仅在使用valid_referers中的域名反向解析时才需要,一般不用) - 注意 HTTPS 站点引用 HTTP 资源时,现代浏览器会清空 referer(Referrer Policy 限制),此时即使域名合法也会被拦截,建议统一协议或显式设置
Referrer-Policy: no-referrer-when-downgrade
进阶建议:避免过度依赖 referer
Referer 天然可伪造,仅靠 valid_referers 属于“防君子不防小人”。生产环境建议组合使用:
- 对敏感资源启用带时间戳和签名的临时链接(如
/file.pdf?expires=1717027200&sign=abc123) - 限制单 IP 单位时间请求数(
limit_req),缓解爬虫批量盗取 - 结合 User-Agent 过滤(谨慎使用,易误伤)或要求 JS 初始化后才加载资源(前端控制)
- 将静态资源托管至对象存储(如 OSS/COS),利用其内置 Referer 黑白名单 + 签名 URL 功能,减轻 Nginx 压力

















