Appearance
🔀 CDN 回源与跳转
这两个词在 CDN 后台里经常挨着出现,很多人以为是同一件事的两种叫法。实际上它们的机制完全不同,配混了会直接把站点搞挂。
最大的区别只有一句话:用户的浏览器知不知道。
回源(Origin Pull)—— 用户无感
用户 → CDN 节点 ──(悄悄去后台取)──> 你的源站
↓
直接把内容返回给用户- 浏览器只跟 CDN 说过话,全程一个请求
- 地址栏不变,用户根本不知道源站的存在
- CDN 会缓存这份内容,下次别人来直接给,不再回源
这是 CDN 的主营业务。所有关于回源协议、回源 Host、SSL 模式、源站证书的配置,管的都是这条线。
跳转(Redirect)—— 用户要再跑一趟
用户 ──①──> CDN
用户 <──② 回一个 301/302:"你去 B 地址"── CDN
用户 ──③ 重新请求 ──> B 地址- 两个独立请求,浏览器地址栏会变
- CDN 只回一个空响应 + 一个
Location头,不传内容 - 第二次请求可能压根不经过 CDN 了
对比
| 回源 | 跳转 | |
|---|---|---|
| 用户感知 | 无感 | 地址栏变了 |
| 请求次数 | 1 次 | 2 次 |
| 内容谁给的 | CDN 给(可能来自缓存) | 目标地址给 |
| 能缓存内容吗 | 能,这是重点 | 只能缓存那条跳转指令 |
| 隐藏源站 | 能 | 暴露(Location 里写着) |
| 速度 | 快 | 多一个往返 |
| 典型用途 | 加速静态资源、整站加速 | 强制 HTTPS、统一域名 |
一句话记住
回源是"我替你去拿",跳转是"你自己去那边拿"。
什么时候用哪个
用回源——99% 的情况。你就是想加速自己的站点,图片、静态资源、整站加速都走这条。
用跳转——只在这几种场景:
| 场景 | 说明 |
|---|---|
| 强制 HTTPS | http:// 来的请求跳到 https://,最常见的用途 |
| 统一域名 | example.com 跳到 www.example.com,避免 SEO 权重分散 |
| 老域名换新域名 | 用 301 让搜索引擎把权重迁过去 |
| 防盗链 | 检测到 Referer 不对,跳到一张警告图 |
301 还是 302
| 301 永久重定向 | 302 临时重定向 | |
|---|---|---|
| 浏览器行为 | 强缓存,下次直接跳,不再问服务器 | 每次都来问 |
| 搜索引擎 | 转移权重给新地址 | 不转移 |
| 改错了 | 很难挽回 | 改完就生效 |
301 会被浏览器"永久"记住
浏览器和中间缓存会把 301 存下来,甚至清缓存都不一定能立刻生效(Chrome 需要手动清 chrome://net-internals/#hsts 或者换域名测试)。
不确定的时候先用 302,验证没问题再改 301。
最常踩的坑:重定向死循环
这个坑几乎所有人都会踩一次,症状是浏览器报 ERR_TOO_MANY_REDIRECTS。
成因:CDN 用 HTTP 回源(比如 Cloudflare 的 Flexible 模式),而源站自己又配了"http 就 301 跳 https":
浏览器 → CDN →(http)→ 源站 →(301 跳 https)→ 浏览器 → CDN →(http)→ 源站 → …源站永远只看到 http 请求,于是永远在喊"你去 https",无限循环。
两种修法
① 跳转规则只配一个地方
要么只在 CDN 上配,源站不配;要么反过来。别两边都配。
② 让源站改看 X-Forwarded-Proto
CDN 回源时会带上这个头,告诉源站"用户那一端用的是什么协议"。源站判断它,而不是判断自己收到的协议:
nginx
server {
listen 80;
server_name example.com;
# ❌ 错误:无脑跳,Flexible 下必死循环
# return 301 https://$host$request_uri;
# ✅ 正确:只有用户那端确实是 http 才跳
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Forwarded-Proto $scheme;
}
}更彻底的解法
把 CDN 的回源模式改成 HTTPS 回源(Cloudflare 对应 Full (strict)),源站收到的就是真实的 https,死循环从根上消失,安全性也更好。
配置方法见 Cloudflare 回源 SSL 与源站证书。
📌 速查
- 回源 = 用户无感、1 个请求、地址栏不变、内容可缓存、源站被隐藏。
- 跳转 = 地址栏会变、2 个请求、只传一条
Location、暴露目标地址。 - 99% 的情况用回源;跳转只用于强制 HTTPS、统一域名、换域名、防盗链。
- 301 会被浏览器强缓存,配错很难挽回;拿不准先用 302。
- 跳转规则别在 CDN 和源站两边都配,这是
ERR_TOO_MANY_REDIRECTS的头号成因。 - 源站要判断协议,看
X-Forwarded-Proto,别看自己收到的协议。 - 从根上避免死循环的办法:改成 HTTPS 回源。