Nginx防盗链需用valid_referers校验Referer,按后缀(如.(jpg|png)$)或目录(如^~ /images/)匹配图片请求,白名单含none、blocked、域名及正则,非法请求return 403,配置后须nginx -t验证并curl测试。

在 Linux 上用 Nginx 保护静态图片资源不被盗链,核心是利用 valid_referers 指令校验请求头中的 Referer 字段,只放行你认可的来源。配置简单但细节关键,稍有疏忽就可能误拦或形同虚设。
明确要保护的图片路径或后缀
防盗链必须落在能精准匹配图片请求的位置,推荐两种写法:
-
按文件后缀匹配:适用于图片分散在各目录,例如
location ~* \.(jpg|jpeg|png|gif|webp)$ -
按目录匹配:适用于图片统一放在
/images/或/static/img/下,例如location ^~ /images/
注意:~* 表示忽略大小写正则匹配;^~ 表示前缀匹配且优先级高,适合静态资源目录。
设置 Referer 白名单
在上述 location 块内添加 valid_referers,定义合法来源:
- none:允许直接在浏览器地址栏输入 URL 访问(如用户收藏图片链接)
- blocked:允许被代理、HTTPS 页面加载 HTTP 资源等导致 Referer 被清空的情况
- yourdomain.com 和 www.yourdomain.com:两个域名需分别列出,它们不是通配关系
- *.yourdomain.com:覆盖所有子域名(如 blog.yourdomain.com、cdn.yourdomain.com)
- ~\.baidu\.:用正则匹配百度系域名(需转义点号)
多个规则是“或”关系,满足其一即视为合法。
拦截非法请求并返回合理响应
白名单设好后,用 if 判断并执行动作:
-
推荐方式:
if ($invalid_referer) { return 403; }—— 语义清晰、日志可查、CDN 和爬虫能正确识别拒绝 -
如需展示提示图:配合
error_page 403 =200 /images/forbidden.png;,既保持 403 状态码,又返回友好图片 -
避免 rewrite 跳转:例如
rewrite ^(.*)$ /forbidden.png last;会导致状态码仍是 200,掩盖盗链行为,还可能引发循环匹配
验证与注意事项
配置完成后别忘了检查和测试:
- 运行
nginx -t验证语法,无报错再systemctl reload nginx - 用
curl -e "https://baidu.com" http://yourdomain.com/test.jpg模拟盗链,应返回 403 - 确保该
location块中已定义root或alias,否则 Nginx 找不到文件,防盗链逻辑无效 - 移动端 App、微信内嵌页常不带 Referer,若业务需要支持,务必保留
none或blocked


















