Nginx 中防盗链需在 proxy_pass 所在的 location 块内,通过 valid_referers + if($invalid_referer) + return 实现;仅作用于静态资源路径(如 /static/ 或后缀匹配),不干扰 API;Referer 默认透传,无需额外配置。

在 Nginx 中,proxy_pass 本身不处理防盗链,但可以通过组合 valid_referers + if + return(或 rewrite)在代理前拦截非法 Referer 请求,从而实现对静态资源的统一防盗链保护。关键在于:防盗链逻辑应放在 location 块中、作用于被代理的静态资源路径,且需注意 if 在 location 中的安全使用边界。
明确防盗链作用范围:只针对静态资源路径
不要在 upstream 或全局 server 块中盲目加防盗链,而应在专门匹配静态资源的 location 中配置,例如:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2?|ttf|eot|svg)$- 或更规范地,将静态资源统一放在
/static/、/assets/下,用前缀匹配:location ^~ /static/
这样既能精准控制,又避免影响 API 接口等动态请求。
配置合法来源白名单(valid_referers)
在对应 location 内设置允许的 Referer 域名,支持精确匹配、正则、泛域名等:
valid_referers none blocked server_names *.example.com example.com ~\.google\. ~\.baidu\.;
-
none:允许无 Referer(如直接访问、书签打开) -
blocked:允许 Referer 被防火墙/隐私插件 stripped 的情况 -
server_names:允许当前 server_name 域名(需配合server_name example.com) - 正则以
~开头,注意转义点号
拦截非法请求并返回自定义响应
利用内置变量 $invalid_referer 判断是否命中白名单,然后拒绝访问:
if ($invalid_referer) {
return 403;
# 或返回透明图:return 200 "/img/forbidden.png";
# 或重定向到提示页:return 302 /forbidden.html;
}
⚠️ 注意:if 在 location 中仅用于简单变量判断(如本例),不建议在其中做 rewrite 或 proxy_pass;Nginx 官方明确说明该用法是安全的。
确保 proxy_pass 正确转发且不干扰 Referer
若后端服务依赖原始 Referer,请显式保留(默认已保留);若需改写,可加:
proxy_set_header Referer $http_referer; # 如需清空 Referer(少见): # proxy_set_header Referer "";
同时确认后端静态资源服务(如另一个 Nginx、CDN 源站、Node.js 静态服务)本身不覆盖或忽略 Referer 校验 —— 防盗链只需在入口 Nginx 做一次即可,无需后端重复校验。
不复杂但容易忽略:防盗链规则必须放在 proxy_pass 所在的 location 内,且优先于 proxy_pass 执行;只要请求匹配该 location,就会先检查 Referer,再决定是否放行给后端。











