直接用 return 301 实现旧 cdn 域名到自建对象存储域名的平滑 301 迁移,需分 http 和 https 独立 server 块配置,https 块必须配覆盖旧域名的有效 ssl 证书,跳转规则应抽离为独立 include 文件管理,并通过 nginx -t、nginx -t 和 curl -i 双协议验证确保生效。

只用 return 实现干净跳转,不走 rewrite
推荐直接用 return 301,性能高、逻辑清晰、无重写开销。关键点有三个:
- HTTP 和 HTTPS 各自独立 server 块,不能混在一个里——Nginx 不允许在同一个 listen 上同时处理 HTTP 和 HTTPS
- HTTP 块中统一跳到新域名的 HTTPS 地址(避免跳 http 再二次跳 https),写成
return 301 https://oss.new-site.com$request_uri; - HTTPS 块必须配好旧域名的 SSL 证书(哪怕只是临时证书),否则 443 端口根本无法建立连接,用户会看到“连接被拒绝”而不是跳转
证书要能覆盖旧 CDN 域名
旧 CDN 域名(如 cdn.old-site.com)的 HTTPS 跳转,依赖你 Nginx 上配置的 ssl_certificate 和 ssl_certificate_key。常见两种方式:
- 申请一张专用于 cdn.old-site.com 的单域名证书(最稳妥,不干扰其他站点)
- 复用新对象存储域名的多域名证书(如证书含 oss.new-site.com 和 cdn.old-site.com),前提是证书确实包含该旧域名
- 千万别用通配符证书 *.old-site.com —— 如果 cdn.old-site.com 是二级域名,而证书只覆盖 *.old-site.com,那它不生效(通配符只匹配一级子域)
把跳转规则抽成独立文件,用 include 管理
别把跳转塞进主站配置里,容易误改、难回滚、上线前没法单独测试。正确做法:
- 新建文件:
/etc/nginx/conf.d/redirect-cdn-old-to-oss.conf - 内容只含两个 server 块:一个 listen 80,一个 listen 443 ssl,其余全是跳转指令和证书路径
- 在主配置或对应站点配置的
http { }或server { }外层(同级位置)加一行:include /etc/nginx/conf.d/redirect-cdn-old-to-oss.conf; - 多个 CDN 域名迁移?就建多个文件,比如
redirect-cdn-v1.conf、redirect-cdn-v2.conf,启用/禁用只需改文件名(加 .disabled 后缀即可)
上线前必须做的三件事
跳转看似简单,但 CDN 层常有缓存残留,浏览器也爱记 301,所以验证不能只看一次 curl:
-
nginx -t检语法,特别注意 include 路径是否存在、Nginx 用户是否有读权限(ls -l /etc/nginx/conf.d/...) -
nginx -T | grep "cdn\.old-site\.com"确认配置真被加载进来,不是被注释或路径写错 - 用
curl -I -k http://cdn.old-site.com/image.jpg和curl -I -k https://cdn.old-site.com/image.jpg分别测,看响应头是否都有Location: https://oss.new-site.com/image.jpg和301 Moved Permanently











