必须加none,否则浏览器直接访问图片等静态资源时因Referer为空被判定非法而返回403;none明确放行地址栏输入、书签、微信内嵌页、App及HTTPS引用HTTP等空Referer场景。

要在 Nginx 中允许空白 Referer(即用户直接在浏览器地址栏输入图片 URL、点击书签、微信内嵌页打开、或某些 App 直接加载)访问静态资源(如 JPG、PNG 等),关键是在 valid_referers 指令中显式加入 none。
为什么必须加 none
浏览器直接访问一个图片链接(例如 https://example.com/img/logo.png)时,Referer 请求头默认为空。如果没有 none,Nginx 会把这类请求判为非法,$invalid_referer 变为 1,导致返回 403 —— 你自己网站的图片反而打不开。
常见触发空 Referer 的场景包括:
- 用户在地址栏手动输入图片 URL
- 从浏览器书签打开图片链接
- 微信内置浏览器、部分 iOS/Android App 内部 WebView
- HTTPS 页面引用 HTTP 资源(受 Referrer Policy 限制,Referer 被清空)
- 隐私模式或禁用 Referer 的浏览器设置
正确配置示例
将以下配置放入匹配图片资源的 location 块中(比如 location ~* \.(jpg|jpeg|png|gif|webp)$):
valid_referers none blocked www.example.com *.example.com;
if ($invalid_referer) {
return 403;
}
说明:
-
none:放行 Referer 为空的请求 -
blocked:放行 Referer 存在但被代理、防火墙或浏览器截断(如只剩域名无协议)的情况 -
www.example.com和*.example.com:允许你自己的主站和子域来源 - 多个规则是“或”关系,顺序无关紧要
常见错误提醒
这些写法容易导致自己网站资源无法加载:
- 只写
valid_referers www.example.com;,漏掉none - 把
none写成None或NULL(大小写敏感,必须小写none) - 把配置放在
http或upstream块里(valid_referers只在server或location内生效) - 未确认
root或alias已正确定义,导致文件根本找不到,防盗链逻辑形同虚设
验证是否生效
可以用 curl 快速测试:
- 模拟空 Referer:
curl -I https://example.com/img/test.jpg→ 应返回200 - 模拟盗链:
curl -e "https://bad-site.com" -I https://example.com/img/test.jpg→ 应返回403
确保重启 Nginx 后再测试:sudo nginx -t && sudo systemctl reload nginx。











