排查 cdn 回源失败需确认 valid_referers 是否误拦,实测 cdn 回源 referer 值(如 cdn 域名、ip 或空),临时用 valid_referers none * 测试,生产环境应精准放行 cdn 域名或 ip 段,并检查 cdn 控制台 referer 透传设置。

排查 Nginx 防盗链规则导致 CDN 回源失败,核心是确认 CDN 节点的请求是否被 valid_referers 拦截,以及其实际携带的 Referer 头是否符合预期。
检查防盗链配置是否误拦 CDN 回源请求
Nginx 的 valid_referers 默认只允许指定域名或空 Referer,而多数 CDN(如阿里云 CDN、腾讯云 CDN、Cloudflare)在回源时会主动设置 Referer,但值不一定是你的业务域名——常见为 CDN 自有域名(如 example.cdn.cloudflare.net)、IP 地址,或干脆清空(取决于 CDN 配置)。若配置中未显式放行这些值,就会返回 403。
- 查看当前防盗链规则,重点关注
valid_referers后的列表,例如:
valid_referers none blocked server_names *.mydomain.com;
该配置未包含 CDN 域名或 IP,也未允许空 Referer(none 表示允许 Referer 为空,但不表示允许任意值),很可能拦截 CDN 回源。
- 临时放宽测试:在
location块中加一行valid_referers none *;(*允许任意 Referer),观察 CDN 图片是否恢复。若恢复,说明问题确实在 referer 校验环节。 - 生产环境切勿长期使用
*,应精准放行。
确认 CDN 回源时实际发送的 Referer 头
不能假设 CDN 怎么发,必须实测。方法有两种:
-
在 Nginx 日志中记录 Referer:修改
log_format,加入$http_referer,例如:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
然后触发 CDN 回源(可清空 CDN 缓存并访问图片 URL),查 access.log,找到对应请求行,看 "$http_referer" 字段内容。常见值有:-(空)、https://cdn.example.com/、http://10.123.45.67(CDN 节点内网 IP)等。
- 用 curl 模拟 CDN 回源:从 CDN 所在地域的 ECS 或服务器上执行(更贴近真实网络路径):
curl -H "Referer: https://a123.cdnprovider.com/" https://your-domain.com/image.jpg -I
观察返回状态码。若返回 403,再比对该 Referer 是否在 valid_referers 列表中。
安全放行 CDN 回源请求的推荐写法
不依赖 Referer 是最稳妥方式,但若必须用防盗链,应明确、最小化放行:
- 放行 CDN 域名和空 Referer(适用于 CDN 默认清 Referer 或设为自身域名):
valid_referers none *.aliyuncdn.com *.qcloud.com *.cloudflare.net;
- 放行 CDN 回源 IP 段(需查阅 CDN 厂商文档获取其回源 IP 段,如阿里云 CDN 提供公网回源 IP 列表):
valid_referers none 101.226.192.0/18 121.194.0.0/16;
-
结合 if + return 避免影响静态资源匹配逻辑(推荐放在
location ~ \.(jpg|jpeg|png|gif)$内):
if ($invalid_referer) {
return 403;
}注意:$invalid_referer 是 Nginx 内置变量,由 valid_referers 自动设置,无需手动定义。
补充验证点:CDN 是否开启“过滤 Referer”或“透传 Referer”
部分 CDN 控制台提供 Referer 相关开关:
- 若开启“**强制清空 Referer**”,则回源请求的 Referer 为
-,此时valid_referers none;即可放行; - 若开启“**透传客户端 Referer**”,则回源 Referer = 用户浏览器发来的 Referer,此时需确保业务域名在
valid_referers中,且 CDN 自身不会额外添加干扰值; - 某些 CDN(如 Cloudflare)默认将 Referer 设为自身边缘节点域名,需在
valid_referers中加入其域名模式(如*.cloudflare.net)。
登录 CDN 控制台,搜索“Referer”、“回源头”、“请求头设置”等关键词,确认实际行为。











