Nginx防盗链通过valid_referers定义合法referer白名单,配合if判断$invalid_referer变量拦截非法请求,仅对图片等静态资源生效,需注意CDN透传、移动端兼容及referer可伪造等限制。

在 Nginx 中防止盗链,核心是通过 valid_referers 指令识别合法来源,再配合 if 判断和 return 或 rewrite 拦截非法请求。重点不是“阻止所有外部访问”,而是只放行可信的 referer(比如你自己的域名),其余一律拒绝或重定向。
配置 valid_referers 白名单
在 server 或 location 块中定义允许的来源。支持精确匹配、通配符、正则等:
valid_referers none blocked server_names *.example.com example.org;-
none:表示无 referer(如直接输入 URL、书签访问) -
blocked:referers 被防火墙或浏览器过滤后只剩协议+域名(无路径参数) -
server_names:匹配 server_name 列表中的域名 -
*.example.com:通配子域名;example.org:精确匹配
用 if 拦截非法请求
判断 $invalid_referer 变量(Nginx 自动设置,为 1 表示不匹配白名单):
-
if ($invalid_referer) { return 403; }→ 返回 403 禁止访问 -
if ($invalid_referer) { rewrite ^/.*\.(jpg|jpeg|png|gif|webp)$ /403.png break; }→ 替换为提示图(需确保 /403.png 存在且可公开访问) - 注意:
if在 location 内使用更安全;避免在 server 级别滥用
针对特定文件类型生效
不要全局拦截,只对静态资源(图片、视频、PDF 等)启用防盗链:
- 把防盗链逻辑写在匹配后缀的 location 块里,例如:
location ~* \.(jpg|jpeg|png|gif|webp|mp4|pdf)$ { ... } - 这样 CSS、JS、HTML 不受影响,不影响页面正常加载
- 如果用了 CDN,确保 CDN 透传真实 referer,否则可能误判
测试与调试要点
防盗链容易误伤,上线前务必验证:
- 用 curl 测试:
curl -H "Referer: https://baidu.com" https://yoursite.com/image.jpg应返回 403 - 用浏览器开发者工具,修改请求头 referer 后刷新图片,看是否被拦截
- 检查日志:
log_format referer_log "$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\"";方便排查误拦 - 移动端 WebView、微信内嵌页常无 referer 或被清空,可酌情保留
none或加 UA 判断辅助
不复杂但容易忽略 referer 可被伪造,所以防盗链只是基础防护,敏感资源还需结合 token 验证或登录态校验。


















