必须在valid_referers中显式添加none,否则空Referer(如直接地址栏访问、书签、微信内嵌页等)会被判为非法并返回403;none与blocked、域名等白名单项需共存于location块,并配合if($invalid_referer){return403;}生效。

要在防盗链配置中允许空 Referer(比如用户直接在浏览器地址栏输入图片或 CSS 地址),关键是在 valid_referers 指令里显式加上 none。否则 Nginx 会把这类请求当成非法来源,返回 403 错误——你自己的网站反而打不开静态资源。
为什么必须加 none
浏览器直接访问一个资源(如 https://example.com/logo.png)时,不会发送 Referer 请求头,也就是 Referer 字段为空。Nginx 把这种情况归类为 none 类型。如果 valid_referers 里没写 none,Nginx 就判定为非法,$invalid_referer 变成 1,触发后续的拦截动作。
- 书签点击、微信内嵌页、App 内 WebView 加载、HTTPS 页面引用 HTTP 资源等场景,也常出现空 Referer
- 隐私模式、某些浏览器扩展或移动端 SDK 也会主动清空 Referer
- 不加
none,会导致首页能打开,但图片/CSS/JS 加载失败,页面显示异常
怎么正确配置 valid_referers none
在对应静态资源的 location 块中,把 none 和其他合法来源一起写进 valid_referers:
valid_referers none blocked *.example.com example.com;-
none放最前面或任意位置都行,但必须存在 -
blocked用于放行被防火墙或隐私插件“抹掉”的 Referer(比如值是""或unknown) - 通配符
*.example.com不匹配主域名example.com,所以要单独列出来
配合 if 判断生效
valid_referers 本身只是设置规则,真正拦截要靠 if ($invalid_referer):
-
if ($invalid_referer) { return 403; }—— 直接拒绝 - 也可以重定向:
rewrite ^/ https://example.com/forbidden.jpg last; - 注意:不要在
if里用return+ 复杂路径,容易出错;优先用return 403
常见误区提醒
很多人只写了域名白名单,却漏掉 none,结果自己访问都 403。还有些人误以为加了 server_names 就自动包含空 Referer——其实完全不相关。
-
server_names只匹配非空 Referer 中的域名部分 -
none和blocked是独立类型,必须手动列出 - 配置改完记得
nginx -t测试语法,再nginx -s reload生效


















