允许空 Referer 必须显式配置 valid_referers none,否则直接访问等合法场景会返回403;它仅设置$invalid_referer变量,需配合同location内的if($invalid_referer)实现拦截。

允许空 Referer 是防盗链配置中一个常见但关键的业务需求,主要对应用户直接在浏览器地址栏输入资源 URL、点击书签、新标签页打开、HTTPS 跳转 HTTP 等场景。若不显式放行,这些合法访问会被误拦截。
必须显式添加 none 到 valid_referers
空 Referer 不是默认放行项,Nginx 要求你主动声明。只写域名或通配符(如 example.com *.example.com)会把直接访问也拒掉。
-
valid_referers none server_names *.example.com example.com;✅ 正确:包含 none -
valid_referers server_names *.example.com example.com;❌ 错误:直接访问返回 403 -
valid_referers "" server_names ...❌ 无效:Nginx 不识别空字符串,none 是唯一合法关键字
配合 if($invalid_referer) 使用才生效
valid_referers 本身不拦截请求,它只是为内置变量 $invalid_referer 赋值(匹配失败时为 1)。拦截动作必须由 if 块触发,且该 if 必须和 valid_referers 在同一个 location 块内。
- 不能把
valid_referers写在server块,再在子location里写if—— 变量作用域不跨块 - 推荐将防盗链逻辑限定在静态资源 location 中,例如:
location ~* \.(jpg|png|css|js)$ - 动作可选 return 403、rewrite 到提示图,或自定义日志记录
区分 none 和 blocked 的适用场景
none 对应的是请求头完全缺失 Referer 字段;blocked 对应的是 Referer 存在但被代理、防火墙或隐私策略清空/屏蔽(如值为空字符串或非 http(s):// 开头)。
- 普通用户直接访问、书签、新标签页 → 属于 none,必须加
- 企业内网经代理访问、某些安全浏览器扩展拦截 → 可能触发 blocked,建议一并加入白名单
- 两者可共存:
valid_referers none blocked *.example.com example.com;
验证是否配置成功
用 curl 模拟不同 Referer 状态,观察响应码:
-
curl -H "Referer:" https://yoursite.com/image.jpg→ 应返回 200 -
curl -H "Referer: http://evil.com" https://yoursite.com/image.jpg→ 应返回 403 - 浏览器开发者工具 Network 标签中,查看资源请求的 Request Headers 是否无 Referer,同时 Response Status 为 200


















