nginx防盗链关键在于valid_referers定义白名单并用return 403直接返回轻量文本响应,禁用重定向和html渲染,确保响应体简洁、头信息精准,兼顾none/blocked以兼容无referer场景。

在 Nginx 中实现防盗链并返回轻量级拒绝提示(如 403 或自定义状态码 + 简洁响应体),关键在于精准识别非法 Referer,并用最小开销终止请求,避免重定向或加载完整页面。
1. 基于 Referer 的基础防盗链配置
使用 valid_referers 指令定义白名单来源,不匹配的请求直接拒绝:
location ~ \.(jpg|jpeg|png|gif|webp|svg|mp4|webm)$ {
valid_referers none blocked server_names
*.example.com example.com
~\.google\.
~\.bing\.;
if ($invalid_referer) {
return 403 "Access denied: invalid referer";
}
}
说明:
-
none:允许无 Referer(如直接访问、书签) -
blocked:允许被防火墙/隐私插件 stripped 的 Referer(值非空但无效) -
server_names:匹配当前 server_name 及其子域 -
~\.google\.:正则匹配 Google 等搜索引擎(可选放行) -
return 403后跟字符串,会作为响应体(需开启underscores_in_headers on;不影响此场景)
2. 返回纯文本提示帧(无 HTML、无重定向)
确保响应极简——禁用默认错误页、关闭 HTML 渲染、压缩响应头:
location ~ \.(jpg|jpeg|png|gif|webp|svg|mp4|webm)$ {
valid_referers none blocked server_names *.example.com example.com;
if ($invalid_referer) {
add_header Content-Type 'text/plain; charset=utf-8' always;
add_header Content-Length '27' always;
return 403 "Forbidden: Hotlinking not allowed";
}
# 正常静态文件服务
expires 1h;
add_header Cache-Control "public, immutable";
}
要点:
-
add_header ... always确保 403 响应也携带指定头 -
Content-Length显式设置(Nginx 1.13.6+ 支持自动计算,但显式更稳) - 不使用
error_page 403 /403.html,避免触发文件读取和模板渲染 - 响应体控制在 30 字节内,真正“轻量级”
3. 可选:按 UA 或路径增强判断(防伪造 Referer)
单纯 Referer 易伪造,可叠加简单 UA 过滤(仅限明显爬虫/工具):
if ($invalid_referer) {
set $deny_flag "1";
}
if ($http_user_agent ~* "(curl|wget|httpie|python-requests)") {
set $deny_flag "${deny_flag}1";
}
if ($deny_flag = "11") {
return 403 "Access denied";
}
注意:避免过度依赖 UA,仅作辅助;重点仍放在 Referer 白名单上。
4. 验证与调试技巧
快速验证是否生效:
- 用 curl 模拟盗链:
curl -H "Referer: https://evil.com" https://example.com/image.jpg→ 应得 403 + 纯文本 - 检查响应头:
curl -I -H "Referer: https://evil.com" https://example.com/image.jpg→ 确认含Content-Type: text/plain - Nginx 日志中加
$invalid_referer变量,便于排查误拦
不复杂但容易忽略:确保 if 在 location 块内,且静态文件匹配规则足够精确,避免误伤 API 或字体资源。











