nginx 防盗链需结合 valid_referers 校验 referer、location 精准匹配及 if 拦截,支持白名单、重定向、动态代理;辅以缓存头、安全头与 token/ip/secure_link 多重加固。

配置 Nginx 处理静态资源文件的特定请求来源,核心是结合 Referer 请求头校验 与 精准 location 匹配,在允许合法来源的同时拦截非法引用。这不是单纯“放行文件”,而是有选择地响应——比如只让自家域名或白名单站点能加载图片,其他来源返回 403 或跳转。
用 valid_referers 控制可访问来源
这是最常用、最轻量的方式。Nginx 提供 valid_referers 指令预定义合法 Referer,配合 if 和 return 实现拦截:
- 在
location块内声明白名单,支持域名、正则、none(无 Referer)、blocked(被防火墙篡改过的) - 匹配失败时直接返回 403:
if ($invalid_referer) { return 403; } - 示例:只允许来自
example.com及其子域、或直接输入 URL 访问(无 Referer)的请求加载图片
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
按来源动态代理或重定向
不只拦截,还能对不同来源做差异化处理。例如:内部系统调用走内网代理,外部合作方走 CDN,非法来源返回占位图。
- 用
map提取 Referer 并映射目标上游:map $http_referer $backend { ~\.partner\.com$ partner_upstream; default default_upstream; } - 在 location 中使用:
proxy_pass http://$backend; - 或用
rewrite将盗链请求重写为统一提示页:rewrite ^/images/(.*)$ /placeholder.jpg break;
配合缓存与安全头强化效果
防盗链生效后,建议同步优化响应行为,避免被绕过或误伤:
- 对已放行的静态资源加缓存头,减少重复校验开销:
expires 1y; add_header Cache-Control "public, immutable"; - 隐藏服务器信息,降低攻击面:
server_tokens off; - 禁止目录浏览,防止路径猜测泄露:
autoindex off; - 限制请求方法,仅允许可读操作:
if ($request_method !~ ^(GET|HEAD|OPTIONS)$) { return 405; }
注意 Referer 的局限性与补充手段
Referer 可被客户端伪造,不能作为唯一安全防线。生产环境应叠加其他机制:
- 对关键资源(如下载链接)添加一次性 token 参数,服务端校验时效性与签名
- 结合 IP 白名单(
allow/deny)用于可信内网场景 - 使用
secure_link模块生成带过期时间与哈希的加密 URL - 日志中记录
$http_referer和$remote_addr,便于审计异常流量











