CDN与源站Apache 301重定向需分工明确:CDN处理域名切换、HTTP→HTTPS、www统一等全局跳转;源站仅负责路径映射(如/product.php?id=123→/products/123),避免重复配置导致循环跳转或权重丢失。

CDN 节点和源站 Apache 的 301 重定向不能随意叠加,否则容易引发循环跳转、状态码错误或 SEO 权重丢失。正确配合的关键是“分工明确”:CDN 处理高频、全局性跳转(如域名切换、协议强制),源站只负责精细、动态路径映射,且双方不重复处理同一类请求。
CDN 层该做什么:接管通用跳转,避免回源
把以下三类规则优先放在 CDN 控制台(如 Cloudflare Page Rules、阿里云全站加速 URL 重写、腾讯云 CDN 重定向):
- 旧域名 → 新域名(如 old.com/* → https://new.com/$1)
- HTTP → HTTPS(全站强制,不依赖源站 80 端口跳转)
- www 与非 www 统一(如 ^www\.example\.com$ → https://example.com/)
这些规则在边缘节点直接返回 301 响应,不触发回源,毫秒级完成,也避免源站 Apache 负载升高。
源站 Apache 该做什么:专注路径映射,不碰域名/协议
源站只处理 CDN 已放行、但路径结构变化的请求,例如:
- /product.php?id=123 → /products/123
- /blog/2020/05/post.html → /posts/post-slug/
- /wp-content/uploads/ → /assets/uploads/(需 RewriteCond 判断 URI)
配置全部写在 .htaccess 或虚拟主机的 RewriteRule 块中,不加协议和域名,目标用相对路径或完整新域名(推荐后者以防 CDN 缓存干扰)。结尾必须加 ? 清除原查询字符串,例如:RewriteRule ^product\.php$ /products/%1? [R=301,L]
必须避开的典型冲突点
以下组合会导致 301 循环或状态码异常,务必检查:
- CDN 配了 old.com → new.com,源站又配了相同的域名跳转
- CDN 开启“跟随源站重定向”,而源站对 HTTP 请求做了 301 跳 HTTPS,此时 CDN 回源拿到 301,再返回给用户,用户再发请求……形成套娃
- 阿里云全站加速未将端口改为 443,却在源站 Nginx/Apache 强制 80→443,造成无限重定向
验证方式:用 curl -I http://old-url 查看响应头中的 Location 和跳转次数,确保只有一次 301,且最终 URL 正确可达。
上线前的协同测试步骤
- 先关闭 CDN 的重定向功能,单独测源站规则是否生效(curl 直连源站 IP 或 Host 头模拟)
- 再关闭源站跳转,只开 CDN 规则,确认域名/协议类跳转正常
- 最后两者同时开启,用不同 URL 类型(首页、带参数页、深层目录)交叉验证,重点检查 Google Search Console 中的“覆盖率”和“移动可用性”报告


















