图片全部无法加载,大概率是防盗链规则误拦合法请求;需检查valid_referers是否范围过窄、none/blocked是否误用或遗漏https/移动端referer,确认其与if($invalid_referer)同在location块内且域名列表完整(如显式包含example.com、www.example.com、*.example.com、https://等),并通过curl模拟不同referer及查看error_log中“access forbidden by rule”精准定位。

图片全部无法加载,大概率是防盗链规则把合法请求也拦截了。重点检查 valid_referers 的配置范围是否过窄、是否误用了 none 或 blocked、以及是否遗漏了 HTTPS 协议或移动端等常见 referer 场景。
确认防盗链规则是否实际生效
先查 Nginx 配置中是否真的启用了防盗链逻辑,典型写法是:
- 存在
valid_referers指令(通常在location ~* \.(jpg|jpeg|png|gif)$块内) - 紧跟着有
if ($invalid_referer) { return 403; }或类似拒绝动作 - 注意:Nginx 中
if在location内使用是受限的,但用于$invalid_referer是官方允许的例外
检查 valid_referers 的域名列表是否完整
valid_referers 默认只匹配精确域名,不自动包含子域或协议变体:
- 写了
valid_referers example.com;→ 只放行example.com,不包括www.example.com、https://example.com、mobile.example.com - 正确做法是显式列出常用形式:
valid_referers none blocked example.com www.example.com *.example.com https://example.com https://www.example.com; -
none允许直接访问(如地址栏输入图片 URL)、blocked允许 Referer 被浏览器主动删除或伪造为无协议的请求(如某些 WebView 或 PWA 场景)
用 curl 模拟不同 Referer 请求验证规则
别依赖浏览器反复刷新,用命令快速定位问题:
- 模拟合法来源:
curl -H "Referer: https://www.example.com/page.html" https://yoursite.com/image.jpg -I→ 应返回 200 - 模拟空 Referer:
curl -H "Referer:" https://yoursite.com/image.jpg -I→ 若配置了none,应返回 200;否则是 403 - 模拟非法来源:
curl -H "Referer: https://evil.com" https://yoursite.com/image.jpg -I→ 应返回 403 - 注意:Chrome 等浏览器在从 HTTPS 页面跳转到 HTTP 图片时会清空 Referer,若你的站点混用协议,需在
valid_referers中同时包含 HTTP/HTTPS 版本
查看错误日志快速定位拦截原因
打开 Nginx 错误日志(error_log /var/log/nginx/error.log notice;),然后重现图片加载失败操作:
- 搜索
access forbidden by rule,日志里会明确记录哪条if触发了 403 - 同时开启 access_log 的自定义格式,加入
$http_referer和$status,例如:log_format debug '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 这样就能看到被拒请求的真实 Referer 值,比猜更可靠











