最稳妥防盗链方式是valid_referers配合location匹配图片后缀:location ~ .(jpg|jpeg|png|gif|webp|bmp|ico)$内配置valid_referers none blocked server_names .example.com ~.google. ~.baidu.,并用if($invalid_referer){return 403;}拦截。

直接用 valid_referers + $invalid_referer 配合 location 匹配图片后缀,是最稳妥、最常用的防盗链方式。关键不是堆规则,而是位置准、白名单实、拦截稳。
精准匹配图片资源路径
防盗链必须作用在具体静态资源上,不能写在 http 或根 location / 里全局生效。推荐用后缀正则匹配,简洁且兼容性好:
- 基础写法:
location ~* \.(jpg|jpeg|png|gif|webp|bmp|ico)$ - 若资源集中放在
/static/下,可更严格:location ~* ^/static/.*\.(jpg|jpeg|png|gif|webp)$ - 确保该 location 内有
root或alias指向真实文件目录,否则请求会 404
设置合理 Referer 白名单
valid_referers 必须写在对应 location 块内,一行搞定,支持多种合法来源组合:
-
none:允许无 Referer 请求(用户直接输入图片地址、书签、微信内嵌页、部分 App) -
blocked:允许 Referer 被代理或隐私模式清空的请求 -
server_names:自动放行本 server 配置的所有server_name及其子域 -
*.example.com或example.com:明确指定主站及子域 -
~\.google\.、~\.baidu\.:加转义点号,匹配主流搜索引擎(利于 SEO 抓取)
常见组合示例:valid_referers none blocked server_names *.your-site.com ~\.google\. ~\.baidu\.;
安全拦截非法请求
校验后必须显式处理 $invalid_referer,推荐两种方式,都需避免踩坑:
- 返回标准禁止响应:
if ($invalid_referer) { return 403; } - 返回友好占位图:
if ($invalid_referer) { rewrite ^/.*\.(jpg|jpeg|png|gif)$ /img/hotlink.png break; }
注意:rewrite ... break 是安全做法;切勿在 if 中使用 proxy_pass 或 root,Nginx 官方明确不推荐。
验证与避坑要点
配置完务必执行两步:
- 语法检查:
nginx -t,通过再重载:nginx -s reload - 用 curl 测试:
curl -H "Referer: https://bad-site.com" https://your-site.com/test.jpg应返回 403;curl https://your-site.com/test.jpg(无 Referer)应正常返回 - HTTPS 页面引用 HTTP 图片会丢失 Referer,确保协议一致;移动端或微信内嵌页常无 Referer,白名单中保留
none很关键











