对象存储开启防盗链后图片不显示?Referer、空来源与 CDN 回源排查

对象存储开启防盗链后图片不显示,需要对照实际 Referer、白名单匹配方式、空来源设置及 CDN 回源条件。本文结合阿里云 OSS、腾讯云 COS 和浏览器官方资料,提供三组 curl 请求用于对比,区分 CDN 边缘拦截、存储校验与 CORS 问题,并说明签名 URL 的产品差异、规则回滚和最终验收方法。

对象存储开启防盗链后,原本正常的图片突然变成空白或 403,先查看失败图片请求实际携带的 Referer,再对照拦截规则。白名单填了网站域名,也可能因为协议、子域名、空来源处理或 CDN 回源时的请求头不同而无法匹配。

本文面向把网站图片放在阿里云 OSS、腾讯云 COS,并可能通过 CDN 加速的站点。下面的命令是诊断示例,域名与路径需替换为你有权访问的测试资源;不同产品的规则不能直接照搬。

在失败页面里找请求,不要只看地址栏测试

打开浏览器开发者工具,在 Network 中筛选图片,刷新故障页面,记录失败请求的完整地址、HTTP 状态码、Request Headers 中的 Referer,以及响应中的错误码、请求 ID 和缓存相关字段。浏览器自带的内存或磁盘缓存也要留意。

把图片 URL 直接贴进地址栏,与在文章页面中嵌入图片,会产生不同的请求条件。直接打开链接往往不带 Referer;页面里的图片可能带网站来源。因此,“单独打开成功、文章里失败”和“单独打开失败、文章里正常”都可以出现。[1]

现象 先验证的假设 验证位置
正文图片失败,单独打开成功 网站来源不匹配,而空来源被允许 失败请求的 Referer 与白名单
正文图片正常,直接打开失败 非空来源放行,空来源被拦截 空 Referer 设置
存储源地址成功,CDN 地址失败 CDN 规则、回源请求或缓存响应不同 CDN 日志、回源设置和源站日志
某个域名正常,另一个子域名失败 子域名、协议或端口匹配范围不足 实际来源与对应产品的匹配语法
对象返回 403,并有权限或签名错误 请求还未满足访问权限要求 XML/JSON 错误内容与授权方式

这些是排查假设,最终需要请求和日志支持。仅凭 403,无法确定就是 Referer 防盗链。

用同一张图片比较三种 Referer

以下示例适用于安装了 curl 的 Linux、macOS 或类 Unix 终端,使用 GET 读取响应头并丢弃响应体。选一张较小的测试图片,减少重复请求产生的流量。

# A:不发送 Referer,模拟空来源
curl --noproxy '*' --connect-timeout 5 --max-time 15 \
  -sS -D - -o /dev/null \
  'https://img.example.com/assets/test.jpg'

# B:发送自有网站来源
curl --noproxy '*' --connect-timeout 5 --max-time 15 \
  -sS -D - -o /dev/null \
  -e 'https://www.example.com/' \
  'https://img.example.com/assets/test.jpg'

# C:发送一个不应放行的示例来源
curl --noproxy '*' --connect-timeout 5 --max-time 15 \
  -sS -D - -o /dev/null \
  -e 'https://untrusted.example.org/' \
  'https://img.example.com/assets/test.jpg'

curl 的 -e 用于设置 Referer,-D - 输出响应头,--noproxy '*' 避免走本机代理。[6] 首轮保留重定向响应,确认测试 URL 的实际处理位置。若出现 301 或 302,再检查 Location,确定下一跳是否仍是预期图片域名。

三次请求除 Referer 外尽量一致。私有资源需要使用有效的授权方式,但签名 URL 可能包含访问凭据,不要把完整命令、地址和响应复制到公共评论区。命令成功也只代表该次构造请求成功,还要回到浏览器验证。

白名单要匹配“引用图片的网页来源”

假设文章地址是 https://www.example.com/posts/a,图片地址是 https://img.example.com/a.jpg。浏览器请求图片时,Referer 描述的是引用页面的来源。只把图片域名加入白名单,可能没有放行文章所在的网站。

随后核对以下项目:

  • 实际网页使用 www.example.com 还是 example.com,移动端、预览域名是否不同。
  • 产品是否区分 http:// 与 https://,是否包含非默认端口。
  • 根域名和子域名是否分别覆盖,通配符支持哪些匹配方式。
  • 黑名单是否先于白名单执行,是否有规则把合法来源提前拒绝。

阿里云 OSS 文档明确列出了黑名单优先、协议匹配和通配符处理;阿里云 CDN 的 Referer 设置又提供独立的匹配选项。[1][4] 同一条字符串在存储桶和 CDN 控制台中的含义未必相同,填写前需要看各自的规则说明。

浏览器策略也会改变 Referer 的详细程度。常见默认策略 strict-origin-when-cross-origin 在同等安全级别的跨源请求中通常只发送源,例如 https://www.example.com/,不会保留整篇文章的路径;no-referrer 会省略 Referer。[3]

因此,按文章完整 URL 配置规则前,先看浏览器实际发送了什么。若页面响应头、HTML 元信息或图片元素单独设置了来源策略,也应一并检查。不要为了迎合某条路径规则,随意把整个站点改成会暴露更多 URL 信息的策略。

空来源是否放行,需要结合访问场景决定

禁止空 Referer 能限制部分直接访问,但也可能影响采用严格来源策略的页面、客户端或其他不发送该头的调用方。允许空来源则会扩大可访问范围。应列出实际要支持的入口,再决定处理方式。

还要注意产品规则的组合条件。按本次核对的阿里云 OSS 文档,空 Referer 的判断与白名单是否为空有关;不能只看到“不允许空 Referer”这个开关,就认定所有空来源请求一定被拒绝。[1] 腾讯云 COS 也有空 Referer 配置,需要与当前名单类型一起核对。[2]

Referer 可以由非浏览器客户端自行设置,上面的 curl 示例就能做到。它适合减少普通外站引用,不能单独承担付费内容或私有文件的身份授权。此类资源还应结合私有权限、有效签名和访问有效期设计。

CDN 需要分开检查边缘拦截和回源校验

使用 CDN 时,请求至少涉及浏览器到 CDN、CDN 到对象存储两段。浏览器带来的 Referer,与源站最终收到的 Referer 是否一致,取决于实际 CDN 产品和请求头配置;不要根据浏览器 Network 面板直接推断源站看到的内容。

可以用下列顺序缩小范围:

  1. 对 CDN 图片地址运行三组请求,记录返回状态、缓存字段和时间。
  2. 在权限允许、且能保持资源授权条件的情况下,对对应存储源地址做相同测试。自定义域名签名或 CDN 私有回源配置不能简单替换域名后比较。
  3. 查 CDN 访问日志,判断是否由边缘规则直接拦截,再查存储日志确认是否发生回源。
  4. 对照回源请求头配置,确认 Referer 被保留、移除还是改写,并核对源站规则。

阿里云 OSS 文档提醒,缓存命中的 CDN 请求可能绕过 OSS 防盗链校验,需要在 CDN 层同步建立对应防护。[1] 腾讯云 COS 文档也区分了 CDN 防盗链与存储防盗链的处理。[2] 调整时应保证两层规则符合相同业务目标,同时按各自语法配置。

如果 CDN 回源时固定写入一个被允许的 Referer,源站看到的就不再是每位访客的网页来源。此时应在 CDN 边缘检查真实访客请求,并用独立的源站访问保护限制绕过 CDN 的访问。固定来源值本身不能替代访客来源校验。

修改完成后,用一张可控测试图片复核。若平台日志确认仍命中旧缓存响应,再按产品支持方式刷新该对象或受影响目录,并等待完成。优先做小范围操作;随意加查询参数未必绕开缓存,也可能改变签名验证条件。

签名 URL 是否接受防盗链检查,各家不同

这一点容易在排障时被忽略。以下是本次核对的官方文档说明,适用对象分别列出:

产品 文档说明的防盗链检查范围
阿里云 OSS 匿名访问及签名 URL 访问 Object 时执行防盗链验证;带 Authorization 的相应 API 签名调用不受该规则限制。[1]
腾讯云 COS 访问对象时带有 URL 或 Header 签名,不进行防盗链验证。[2]

所以,不能笼统地建议“换成签名 URL 就一定绕过防盗链”。先确认存储产品、请求授权形式、URL 是否仍有效,以及 CDN 是否另行执行鉴权或防盗链。

检查响应错误时,也要区分来源不匹配、签名过期、签名计算不一致、对象不存在和权限不足。保留请求 ID,结合服务端日志继续定位,避免通过公开存储桶来掩盖某一条授权配置错误。

CORS 报错要与防盗链分别处理

图片跨域不显示时,还可能遇到 CORS,但调整 CORS 白名单不会自动修正 Referer 防盗链。

普通 <img> 未设置 crossorigin 时,通常按非 CORS 请求加载;给图片设置 crossorigin,或通过脚本读取、在 canvas 中使用图片数据时,会涉及相应的跨域要求。MDN 还说明,设置 crossorigin 而服务端未返回允许该来源的响应头,可以导致图片加载被阻止。[5]

排查时同时看 Network 的响应和 Console 的错误:服务端已经返回拒绝访问,就先处理授权或拦截;服务端返回图片但浏览器报告跨域限制,再核对请求模式与 CORS 响应头。两类问题也可能同时存在,需要分别验收。

保存规则前留好回滚记录

修改前记录存储桶和 CDN 当前规则、空来源选项、回源头设置,以及测试图片的响应。每次只改一组已经定位的配置,避免同时更换域名、权限和 CDN 规则后无法判断哪个修改有效。

最终复查自有网站来源、不可信来源和空来源三组结果,并覆盖实际使用的桌面页面、移动页面或应用入口。每组结果都应与业务预期一致,私有资源还应确认授权失效后无法继续获取。

如果合法请求仍失败,带上请求 ID、发生时间、完整域名和已脱敏的 Referer 查询日志。确认请求在哪一层被拒绝后,再修改该层规则,能减少来回试配和过度放行。

官方参考资料

资料核验日期:2026 年 10 月 15 日。示例命令用于解释诊断方法,未在读者生产环境执行。

[1] 阿里云 OSS:防盗链
https://help.aliyun.com/zh/oss/user-guide/hotlink-protection

[2] 腾讯云 COS:防盗链设置
https://cloud.tencent.com/document/product/436/13319

[3] MDN:Referrer-Policy
https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Referrer-Policy

[4] Alibaba Cloud CDN:Configure a Referer whitelist or blacklist to enable hotlink protection
https://www.alibabacloud.com/help/en/cdn/user-guide/configure-a-referer-whitelist-or-blacklist-to-enable-hotlink-protection

[5] MDN:The Image Embed element,crossorigin 属性
https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/img

[6] curl:Command line tool manual
https://curl.se/docs/manpage.html

云存储实操指南

对象存储图片能上传却无法访问?私有权限、跨域 CORS 与签名 URL 排查指南

2026-9-18 15:16:48

实操指南

云迁移最佳实践:如何高效、安全地迁移到云端

2024-11-5 10:39:27