Nginx防盗链通过valid_referers定义合法Referer白名单,配合if判断$invalid_referer拦截非法请求,仅作用于静态资源location块,避免误伤API;支持none、blocked、server_names及通配域名等匹配方式,并推荐返回403或重定向至默认图。

Nginx 防盗链的核心是通过 valid_referers 指令识别合法来源,再配合 if 判断拒绝非法请求。重点不是“禁止所有外部访问”,而是只允许指定域名或白名单来源访问静态资源(如图片、CSS、JS、视频等)。
明确防盗链作用范围
通常只对静态资源做限制,避免误伤 API 或页面本身。建议在 location 块中针对后缀匹配,例如:
location ~* \.(jpg|jpeg|png|gif|webp|css|js|woff2?|ttf|eot|svg|mp4|avi)$ { ... }- 不要在 server 根 location 或 proxy_pass 区域加防盗链,否则可能拦截正常接口请求
配置合法 referer 白名单
使用 valid_referers 定义允许的来源,支持域名、正则、通配符。常见写法:
valid_referers none blocked server_names *.example.com example.com;-
none:允许直接访问(比如用户在浏览器地址栏输入图片 URL) -
blocked:允许 Referer 被防火墙/隐私插件清空的情况(如 HTTPS 页面引用 HTTP 资源时 Referer 可能被浏览器丢弃) -
server_names:匹配当前 server_name 的所有域名 -
*.example.com:通配子域名,注意不能写成example.*
拦截非法请求并返回响应
在 valid_referers 后用 if 判断 $invalid_referer 变量,然后返回 403 或重定向到默认图:
if ($invalid_referer) { return 403; }- 或更友好:
if ($invalid_referer) { rewrite ^/.*$ /static/forbidden.png break; } - 注意:
return和rewrite ... break都可终止处理,但不要混用 redirect(302)方式,容易被绕过
测试与验证要点
配置完必须验证是否生效,关键点:
- 用 curl 手动模拟不同 Referer:
curl -H "Referer: https://baidu.com" https://yoursite.com/logo.png - 检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log看是否有 rewrite/if 相关报错 - 注意 HTTPS 站点引用 HTTP 资源时浏览器会清空 Referer,此时需保留
blocked选项 - 移动端 WebView、小程序、邮件客户端等可能不带 Referer,按业务决定是否纳入白名单
不复杂但容易忽略 referer 的协议和路径细节,实际生效依赖于客户端真实发送的 Referer 字段,无法防技术型盗链,但对普通爬虫和外站直接引用足够有效。


















