阿里云 OSS 绑定自定义 CDN 域名,需要依次处理域名归属、OSS 回源、DNS CNAME、HTTPS 和缓存规则。域名在哪家购买并不重要,记录要添加到当前的权威 DNS。CNAME 生效后,还要检查证书、源站内容和重复 GET 的缓存状态。
用 NS 确认权威 DNS
TXT 和 CNAME 应添加到 NS 查询返回的权威 DNS:
dig +short example.com NS
返回 DNSPod 的名称服务器,就在 DNSPod 添加记录;返回 Cloudflare、阿里云或其他服务商,就去对应控制台。
选择加速区域
创建 CDN 域名前,先确认用户主要在哪个地区。根据阿里云 CDN 添加加速域名文档(在新标签页打开),截至 2026 年 9 月 2 日,仅选择中国内地以外区域时不要求 ICP 备案;选择中国内地或全球加速时,需要满足中国内地备案要求。
服务商规则可能调整,实际添加域名时应以控制台提示和最新官方文档为准。
图片、字体、CSS、JavaScript 等公开静态资源适合放进这条链路。后台接口、用户私有文件和带身份信息的内容,不能直接套用相同的公开缓存规则。
用 TXT 证明域名归属
首次添加根域下的加速域名时,阿里云可能给出一条 TXT:
主机记录:verification
记录类型:TXT
记录值:verify_一段唯一值
把这条记录原样添加到权威 DNS,再查询完整名称:
dig +short verification.example.com TXT
返回值要与控制台提供的内容完全一致。主机名被重复拼接、复制时多了空格,或者记录类型选错,都会让归属验证失败。阿里云域名归属验证说明(在新标签页打开)列出了控制台支持的验证方式。
把 OSS Bucket 设为源站
在阿里云 CDN 中添加 images.example.com,源站填写 Bucket 的公网 OSS 域名:
bucket-name.oss-cn-hangzhou.aliyuncs.com
不要填对象的完整 URL,也不要把 CDN 分配的 CNAME 反过来当作源站。
公共读 Bucket 可以直接提供公开对象;私有 Bucket 需要使用阿里云支持的 OSS 私有回源鉴权。长期 AccessKey 不应该出现在网页、仓库或公开日志里。
域名刚创建时,阿里云可能仍在下发配置。遇到“域名正在配置”或 ServiceBusy,先等状态完成再继续,不要反复创建同一个域名。
在 DNSPod 添加阿里云给出的 CNAME
阿里云会为加速域名分配一个目标,形式可能类似:
images.example.com.w.kunlunsl.com
在 DNSPod 为主机记录 images 添加 CNAME。这个名称原来如果有 A、AAAA 或另一个 CNAME,先确认旧记录的用途,不能直接覆盖。
dig +short images.example.com CNAME
查询结果与阿里云给出的目标一致,说明别名已经生效。CNAME 的同名冲突和根域限制见 DNS 记录怎么选。
给 CDN 域名配置 HTTPS
证书必须覆盖 images.example.com。可以使用阿里云证书服务,也可以上传其他受信任 CA 签发的证书。
openssl s_client -connect images.example.com:443 \
-servername images.example.com </dev/null
curl -sS -I http://images.example.com/path/image.webp
curl -sS -I https://images.example.com/path/image.webp
网站本身使用 HTTPS 时,图片地址也必须使用 HTTPS,否则浏览器会把它当作混合内容。HTTP 是否跳转到 HTTPS,则按 CDN 控制台中的跳转策略决定。
缓存时间要跟文件更新方式匹配
文件名带内容指纹,例如 app.4f31a2.js 或 cover.91ac8d.webp,内容变化时 URL 也会变化,适合长缓存。经常覆盖同名文件时,缓存时间要更短,或者每次更新后主动刷新 CDN。
| 内容 | 常见做法 |
|---|---|
| 带内容指纹的图片、字体、JS、CSS | 长缓存,可使用 immutable |
| 不带指纹、偶尔覆盖的图片 | 较长缓存,更新后刷新 CDN |
| HTML | 短缓存或不缓存 |
| 私有文件 | 不公开缓存,使用鉴权或签名 URL |
| 404、5xx | 谨慎缓存,避免临时错误长期留在边缘 |
阿里云缓存过期时间文档(在新标签页打开)建议根据资源更新频率设置 TTL。
跨域加载字体、Canvas 读取图片或前端直接请求对象时,还要设置准确的 CORS 响应头。不要在允许携带凭证的同时放开任意来源。
验证回源对象和缓存命中
先用源站域名和 CDN 域名请求同一个对象,比较文件内容:
curl -sS -o /tmp/origin.bin \
'https://bucket-name.oss-cn-hangzhou.aliyuncs.com/path/image.png'
curl -sS -o /tmp/cdn.bin \
'https://images.example.com/path/image.png'
shasum -a 256 /tmp/origin.bin /tmp/cdn.bin
哈希一致,说明 CDN 没有回到错误的 Bucket 或对象。随后对 CDN 地址连续发起两次真实 GET:
curl -sS -D - -o /dev/null \
'https://images.example.com/path/image.png'
curl -sS -D - -o /dev/null \
'https://images.example.com/path/image.png'
第一次常见 X-Cache: MISS,第二次可能变成 X-Cache: HIT。同时查看 Cache-Control、Age 和 ETag,才能区分“经过 CDN”和“已经命中缓存”。阿里云 CDN 生效检查说明(在新标签页打开)给出了响应头的判断方式。
images.stackonward.com 在 2026 年 9 月 1 日接入时,同一个公开 PNG 对象的源站与 CDN ETag 一致,连续两次 GET 从 MISS TCP_MISS 变为 HIT TCP_MEM_HIT。这只能说明该对象和当时命中的边缘节点正常,其他文件类型仍要分别抽样。
按响应现象排查
| 现象 | 常见原因 |
|---|---|
| TXT 一直未通过 | 主机名重复拼接、值多了空格、记录尚在缓存 |
| CNAME 查询正确但 HTTPS 报错 | 证书未覆盖域名,或证书仍在下发 |
| CDN 返回 404,OSS 可以打开 | 源站 Bucket、回源 Host 或对象路径不一致 |
| 连续请求仍然 MISS | 响应不可缓存、缓存键变化、规则未生效或节点不同 |
| 网站更新后仍显示旧图 | 同名文件被长缓存,需要刷新或改用新 URL |
| 字体或 Canvas 被浏览器拦截 | CORS 响应头不符合当前来源 |
先抽样,再替换全站图片地址
先挑几张不同类型的文件接入新域名,确认 HTTPS、文件哈希、缓存和跨域行为都正常,再逐步替换其他链接。旧 OSS 地址至少保留到回滚窗口结束。
如果 CDN 域名还在配置中,或者只有 CNAME 正确但证书和回源尚未可用,提前替换全站链接会把一个局部问题放大成整站图片故障。
常见问题
OSS 自定义域名一定要接 CDN 吗?
不一定。只需要品牌化访问域名时,可以使用 OSS 支持的自定义域名;需要边缘缓存、访问加速和统一 HTTPS 策略时,再接 CDN。
域名在腾讯云,OSS 在阿里云,可以配置吗?
可以。先确认当前权威 DNS,再把阿里云提供的 TXT 和 CNAME 值添加到该 DNS。服务商不必相同。
没有 ICP 备案可以用阿里云 CDN 吗?
按阿里云当前规则,仅使用中国内地以外加速区域时不要求 ICP 备案;中国内地或全球加速需要满足备案要求。接入时要重新核对官方说明。
CNAME 生效后为什么还是 MISS?
第一次访问、缓存键不同、响应不可缓存、规则正在下发或请求落在不同边缘节点,都可能产生 MISS。连续请求完全相同的 URL,并同时检查 Cache-Control、Age、ETag 和缓存状态。
怎样确认 CDN 没有回错 Bucket?
用源站域名和 CDN 域名请求同一路径,比较状态码、长度、ETag 和文件 SHA-256。内容一致后再替换站内链接。