valid_referers 必须在 location 块中配置才生效,需精确匹配资源后缀(如 jpg|png 等),配合 if ($invalid_referer) 拦截,并注意 cdn 需透传 referer 才能协同工作。

直接在 server 块里写 valid_referers 是无效的,它必须嵌套在匹配具体资源的 location 块中才能起作用。核心是:限定哪些文件后缀受保护、定义谁可以引用、再拦截不合规请求。
只对图片等静态资源启用校验
不能把防盗链规则放在 server 根层级,否则 Nginx 会报错或被宝塔等面板覆盖。正确做法是用 location 精确匹配目标后缀:
-
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ { ... }—— 覆盖主流图片格式,~*表示忽略大小写 - 避免写
location /static/这类宽泛路径,否则可能误拦 CSS、JS 或字体文件 - 视频、PDF、压缩包等高带宽资源可单独加一个
location块扩展防护
白名单必须包含三类基础来源
valid_referers 不是“只允许这些”,而是“匹配上就让 $invalid_referer 为 0”。漏掉关键类型会导致自家页面图片打不开:
- none:允许直接输入图片 URL、书签访问、HTTPS 页面引用 HTTP 图片时 Referer 被清空的情况
- blocked:覆盖微信内嵌浏览器、某些代理或防火墙修改 Referer 后只剩路径或 localhost 的场景
-
域名或通配符:如
example.com、*.example.com(注意*只能放开头) - 可选加搜索引擎:
~\.google\. ~\.baidu\. ~\.bing\.,点号记得转义
拦截非法请求并返回合理响应
仅写 valid_referers 不会自动拦截,必须配合 if 判断变量 $invalid_referer:
- 返回 403 禁止访问:
if ($invalid_referer) { return 403; } - 重定向到提示图(需提前上传):
if ($invalid_referer) { rewrite ^/.*$ /images/hotlink-denied.png break; } - 不要用
rewrite ... redirect跳转外部页面,易暴露逻辑或引发循环 - 如果用了提示图,要单独为该图配置
location = /images/hotlink-denied.png,避免它自己也被防盗链规则拦住
CDN 场景下必须双层配置
如果网站接入了 CDN,单靠 Nginx 配置往往失效,因为 CDN 默认不透传 Referer:
- 在 CDN 控制台开启 Referer 白名单,并填入你的主域和子域(如
example.com、*.example.com) - 在 CDN 回源设置中启用「透传 Referer」或「保留原始 Referer 头」
- CDN 层拦截失败时,请求仍会回源到你的 Nginx,所以宝塔/Nginx 层的规则仍需保留,形成兜底










