Skip to content

🔀 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% 的情况。你就是想加速自己的站点,图片、静态资源、整站加速都走这条。

用跳转——只在这几种场景:

场景说明
强制 HTTPShttp:// 来的请求跳到 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. 回源 = 用户无感、1 个请求、地址栏不变、内容可缓存、源站被隐藏
  2. 跳转 = 地址栏会变、2 个请求、只传一条 Location、暴露目标地址
  3. 99% 的情况用回源;跳转只用于强制 HTTPS、统一域名、换域名、防盗链。
  4. 301 会被浏览器强缓存,配错很难挽回;拿不准先用 302。
  5. 跳转规则别在 CDN 和源站两边都配,这是 ERR_TOO_MANY_REDIRECTS 的头号成因。
  6. 源站要判断协议,X-Forwarded-Proto,别看自己收到的协议
  7. 从根上避免死循环的办法:改成 HTTPS 回源

技术笔记