最基础的图片与资源防盗链通过valid_referers检查Referer请求头并配合if拦截非法访问,匹配资源用location限定后缀,白名单需包含none、blocked、域名及可选搜索引擎,拦截可返回403或重定向提示图,配置后须测试验证。

最基础的图片与资源防盗链,核心就是用 valid_referers 检查请求头里的 Referer,再配合 if 拦掉不合规的访问。它不加密、不鉴权,但配置简单、生效快,适合快速上线防护。
匹配目标资源类型
用 location 块限定要保护的文件后缀,常见写法:
-
~* \.(jpg|jpeg|png|gif|webp|bmp)$—— 匹配主流图片格式,~*表示忽略大小写 -
~* \.(mp4|avi|flv|pdf|zip|rar)$—— 可按需扩展到视频、文档、压缩包等带宽消耗大的资源 - 避免写太宽泛的路径(如
/static/),否则可能误拦 CSS、JS 等关键资源
设置合法来源白名单
valid_referers 不是“只允许这些”,而是“匹配上就让 $invalid_referer 为 0”。必须包含以下几类才不容易误伤:
-
none:允许直接在浏览器地址栏输入 URL、书签访问、HTTPS 页面引用 HTTP 图片时被清空 Referer 的情况 -
blocked:覆盖被代理、防火墙或某些 App(如微信内嵌浏览器)修改后只剩路径或 localhost 的场景 -
server_names或具体域名:比如example.com *.example.com,支持通配符*,但只能放开头(*.example.com✅,example.*❌) - 可选加搜索引擎:如
~\.google\. ~\.baidu\. ~\.bing\.,注意点号要转义(\.)
拦截非法请求并响应
判断 $invalid_referer 是否为 1,然后决定怎么处理:
- 返回 403 禁止访问:
if ($invalid_referer) { return 403; } - 重定向到默认提示图(需提前准备好):
if ($invalid_referer) { rewrite ^/.*$ /images/hotlink-denied.png break; } - 不建议用
rewrite ... redirect跳转外部页面,容易暴露逻辑或引发循环
验证与避坑要点
配置完别急着 reload,先确认几件事:
- 本地打开网页能正常显示图片(检查是否漏了
none或blocked) - 用
curl -H "Referer: https://bad-site.com" https://yoursite.com/test.jpg测试是否真返回 403 - 日志里加
$invalid_referer $http_referer,观察误拦率和真实盗链特征 - 如果用了 CDN,确认它透传 Referer;否则合法请求也可能被拦










