<p>应在server块中用location精准匹配图片后缀实现防盗链,如location ~* .(jpg|jpeg|png|gif|webp|bmp)$,配合valid_referers设置白名单并排除非图片资源,避免误拦截。</p>

直接在 server 块里配防盗链,关键不是“加一段代码”,而是把规则精准落在图片资源上,避免误伤 HTML、API 或字体文件。
只对图片路径或后缀做限制
防盗链逻辑必须限定在真正需要保护的静态图片范围内。推荐用 location 匹配图片后缀,比如:
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
valid_referers none blocked server_names *.example.com example.com;
if ($invalid_referer) {
return 403;
# 或者重定向到提示图:rewrite ^/ /images/forbidden.png last;
}
}注意三点:
-
~*表示不区分大小写的正则匹配,覆盖.JPG和.png等变体 -
valid_referers必须包含none(直接访问、书签、隐私模式)和blocked(Referer 被代理/防火墙清理) -
server_names后跟你的主域名和子域名,支持*.example.com通配
白名单要写全且合理
常见漏掉的合法来源包括:
- 本域所有子域名(如
cdn.example.com、assets.example.com) - 内部管理后台或预览系统域名
- 第三方平台嵌入(如微信公众号、邮件客户端,它们可能不带 Referer 或用特殊协议)
例如:
valid_referers none blocked
*.example.com example.com
*.weixin.qq.com
mail.google.com;别让防盗链影响正常访问
- 不要在
location /这种宽泛路径下全局启用,否则可能拦住首页加载或 JS 请求 - 避免把
.js、.css、.woff2等非图片资源混进同一规则——字体和脚本常被跨域加载,Referer 可能为空或不可控 - 测试时用
curl -e "https://baidu.com" http://your.com/test.jpg模拟盗链,再用无-e参数验证直连是否正常
配合日志便于排查
加一行日志格式,方便定位谁被拦了:
log_format referer_log '$remote_addr - $remote_user [$time_local] "$request" $status $invalid_referer "$http_referer"'; access_log /var/log/nginx/referer.log referer_log;
这样配置后,只有请求图片且 Referer 不在白名单内时才触发拦截,其余资源照常服务。不复杂但容易忽略细节。


















