nginx防盗链通过valid_referers指令配合if判断实现,仅允许白名单域名或空referer访问静态资源;支持精确域名、通配符、none及正则匹配,并在静态文件location块中拦截非法请求返回403或自定义图片。

Nginx 防盗链主要靠 valid_referers 指令配合 if 判断实现,核心是拦截非授权来源的请求,只允许指定域名(或空 referer)访问静态资源。
配置 valid_referers 白名单
在 server 或 location 块中定义合法来源:
- 支持精确域名:
valid_referers domain.com www.domain.com; - 支持通配符:
valid_referers *.domain.com; - 允许空 referer(直接输入 URL 访问或书签):
valid_referers none; - 支持正则:
valid_referers ~\.google\.com$ ~\.baidu\.com$;
拦截非法请求并返回结果
定义完 referer 白名单后,用 if 判断并拒绝非法请求:
-
if ($invalid_referer) { return 403; }—— 返回 403 禁止访问 -
if ($invalid_referer) { rewrite ^/.*\.(jpg|jpeg|png|gif|webp|css|js)$ /403.png break; }—— 返回自定义提示图(需确保该图片本身不被防盗链限制) - 注意:
$invalid_referer是 Nginx 内置变量,匹配失败时为 1
只对静态资源生效(推荐写法)
避免影响 API 或动态接口,应把防盗链逻辑限定在静态文件 location 中:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2?|ttf|eot|svg)$ {- 在里面写
valid_referers和if ($invalid_referer) - 结尾加
expires 7d;和add_header Cache-Control "public, immutable";提升缓存效率
测试与注意事项
配置完记得重载 Nginx:nginx -t && nginx -s reload
- 用 curl 测试:
curl -H "Referer: https://bad-site.com" https://yoursite.com/image.jpg应返回 403 - 本地直接访问(无 referer)默认被拒绝,所以务必加
none项,否则 F5 刷新或手机书签会失效 - HTTPS 站点要注意 referer 可能被浏览器策略清空,尤其从 HTTPS 跳转到 HTTP 时
- CDN 或反向代理后,如果真实 referer 被覆盖,需检查
$http_referer是否被正确传递











