Nginx防盗链需拒绝空Referer时,应使用valid_referers指令且不包含none参数,配合$invalid_referer判断并返回403;$http_referer为空字符串时if判断不可靠,valid_referers天然支持过滤空Referer。

Nginx 防盗链时,空 Referer(即请求头中 Referer 字段为空或缺失)通常被视为“合法来源”,比如用户直接在浏览器地址栏输入 URL、书签访问、或 HTTPS 页面跳转到 HTTP 资源等场景。但有时你希望拒绝空 Referer 的请求(即只允许明确来自白名单域名的请求),这就需要显式拦截空值。
关键点:Nginx 的 $http_referer 变量在请求头无 Referer 或值为空字符串时,其值为 空字符串 ""(不是未定义,也不是 "none")。因此不能靠 if ($http_referer = "") 简单判断——因为 Nginx 的 if 对空字符串匹配不稳定,且 if 在 location 中有诸多限制。
更可靠、推荐的做法是用 valid_referers 指令配合 invalid_referer 判断,它天然支持过滤空 Referer。
使用 valid_referers 显式禁止空 Referer
location ~ \.(jpg|jpeg|png|gif|webp|js|css)$ {
valid_referers none blocked server_names
*.example.com example.com;
if ($invalid_referer) {
return 403;
# 或者重定向:rewrite ^/ https://example.com/403? redirect;
}
}说明:
-
none:允许空 Referer 请求(即用户直接输入 URL、书签访问等) -
blocked:允许 Referer 存在但被防火墙/代理 stripped(如Referer: http://xxx被改写成无协议或无效格式) -
server_names后跟域名:只允许指定域名及其子域名
✅ 要「过滤空请求头」,就不要写 none —— 这是最关键一步。
所以正确写法是:
只允许特定域名,拒绝空 Referer 和非法 Referer
location ~ \.(jpg|jpeg|png|gif|webp|js|css)$ {
valid_referers blocked server_names
example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}此时:
- 请求不含
Referer头 →$invalid_referer为 true → 返回 403 -
Referer为空字符串""→ 同样触发$invalid_referer→ 403 -
Referer是https://bad-site.com→ 403 -
Referer是https://example.com/page或https://cdn.example.com/→ 允许
补充:验证 Referer 是否为空的调试技巧
临时加日志确认行为:
log_format referer_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'invalid_referer:$invalid_referer';
access_log /var/log/nginx/referer.log referer_log;然后用 curl 测试:
curl -H "Referer:" https://yoursite.com/test.jpg # 空 Referer 字符串 curl https://yoursite.com/test.jpg # 完全无 Referer 头
两者都会被 valid_referers 视为非法(因没配 none),触发 403。
注意事项
-
valid_referers必须在location块内使用,不能放在server或http级 -
if ($invalid_referer)是唯一安全使用if的场景之一,Nginx 官方认可 - 不要用
if ($http_referer = "")或if ($http_referer = " "),不可靠且易漏判 - HTTPS 页面引用 HTTP 资源时,浏览器可能主动清空 Referer(Referrer Policy),需结合前端
referrerpolicy="no-referrer-when-downgrade"等协同处理
不复杂但容易忽略。


















