nginx防盗链允许空referer需在valid_referers中显式添加none,以放行地址栏直接访问等无referer场景;必须配合if($invalid_referer)使用,且不可用空字符串替代none。

Nginx 防盗链中允许空 Referer,本质是让直接在浏览器地址栏输入 URL 访问(或书签打开、新标签页跳转等无 Referer 的场景)能正常加载资源,避免误拦截。关键在于 valid_referers 指令要显式包含 none。
以下是具体设置方法:
1. 在 location 块中配置 valid_referers 并判断
在匹配静态资源(如图片、CSS、JS)的 location 块里,用 valid_referers 列出允许的来源,并加上 none 表示接受空 Referer:
location ~* \.(jpg|jpeg|png|gif|webp|css|js)$ {
valid_referers none server_names *.example.com example.com;
if ($invalid_referer) {
return 403;
# 或者重定向到默认图:rewrite ^/.*$ /static/forbidden.png break;
}
}
注意:none 必须写在 valid_referers 行中,且位置无关(可放最前或最后),它代表 HTTP 请求头中 Referer 字段为空或缺失的情况。
2. 理解哪些情况会产生空 Referer
以下行为通常导致 Referer 为空,需确保 none 被包含才能放行:
- 用户直接在浏览器地址栏输入 URL 后回车
- 从 HTTPS 页面链接跳转到 HTTP 资源(浏览器安全策略会清空 Referer)
- 使用
<a href="..." rel="noreferrer"></a>或fetch(..., {referrer: 'no-referrer'}) - 某些隐私模式或浏览器扩展主动屏蔽 Referer
3. 避免常见错误
- 不要遗漏
none:只写server_names example.com会把直接访问也拒掉 - 不要写成
valid_referers "":Nginx 不识别空字符串,none是唯一合法关键字 -
if指令必须紧跟valid_referers所在 location 块内,不能跨块生效 - 若启用了
add_header Referrer-Policy "no-referrer-when-downgrade";,也要留意对 Referer 的影响
4. 测试是否生效
可用 curl 模拟空 Referer 请求验证:
curl -H "Referer:" https://your-site.com/image.jpg # 应返回 200 curl -H "Referer: http://evil.com" https://your-site.com/image.jpg # 应返回 403
也可在浏览器开发者工具 Network 标签中查看请求头,确认 Referer 是否为空并观察响应状态。
不复杂但容易忽略











