You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复浏览器缓存导致的域名切换301重定向循环

解决301缓存导致的域名重定向循环问题

问题背景

我拥有两个域名aaa.com(已接入Cloudflare)和bbb.com(托管于其他服务商),此前长期将aaa.com通过301重定向指向bbb.com。现在计划将aaa.com设为主域名,但用户浏览器缓存了旧的301规则,导致访问时出现aaa.com→bbb.com→aaa.com的重定向循环,需要无需用户手动清缓存即可自动打破循环的方案。

核心思路

301是永久重定向,浏览器会长期缓存该规则,因此需要通过临时过渡策略逐步覆盖旧缓存,同时避免新的循环:

  1. 让主域名aaa.com直接提供内容,不再跳转;
  2. 让原域名bbb.com通过临时重定向+Cookie标记的方式,引导缓存用户过渡到aaa.com,并避免重复循环;
  3. 待旧缓存周期过后,再切换为永久重定向完成收尾。

分步解决方案

1. 调整aaa.com的Cloudflare配置

  • 移除所有指向bbb.com的301重定向规则,确保aaa.com直接返回完整网站内容;
  • 添加页面规则,为aaa.com设置缓存控制头,强制浏览器不缓存重定向相关响应:
    Cache-Control: no-cache, no-store, must-revalidate
    Pragma: no-cache
    Expires: 0
    
    这一步会让后续用户访问aaa.com时,浏览器不再保留旧的301缓存规则。

2. 修改bbb.com的重定向逻辑

将bbb.com的重定向改为条件式临时跳转,用Cookie标记已完成过渡的用户:

  • 当请求bbb.com时,先检查是否存在自定义Cookie domain_switch=done:
    • 若存在:直接返回网站内容,或显示静态提示页引导用户访问aaa.com(避免再次跳转循环);
    • 若不存在:返回307临时重定向到aaa.com,同时设置Cookie:
      Set-Cookie: domain_switch=done; Path=/; Max-Age=2592000; SameSite=Lax
      
      (Max-Age设为30天,覆盖绝大多数浏览器对301的缓存周期)
  • 选择307而非301的原因:307是临时重定向,浏览器不会永久缓存该跳转规则,避免后续出现新的缓存冲突。

3. 过渡周期后的收尾

等待30天(旧301缓存的最长有效期)后:

  • 修改bbb.com的配置,直接返回301永久重定向到aaa.com;
  • 移除bbb.com上的Cookie判断逻辑,以及aaa.com上的强制不缓存头,恢复正常的缓存策略。

备选方案:Cloudflare Worker优化过渡

利用aaa.com的Cloudflare Worker拦截请求,进一步优化过渡体验:

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  const cookie = request.headers.get('Cookie')
  // 检查是否已完成过渡
  if (cookie && cookie.includes('domain_switch=done')) {
    // 直接返回网站内容
    return fetch(request)
  } else {
    // 检查是否是从bbb.com跳转过来的(避免循环)
    const referer = request.headers.get('Referer')
    if (referer && referer.includes('bbb.com')) {
      // 返回内容并设置Cookie
      const response = await fetch(request)
      const newResponse = new Response(response.body, response)
      newResponse.headers.append('Set-Cookie', 'domain_switch=done; Path=/; Max-Age=2592000; SameSite=Lax')
      return newResponse
    } else {
      // 正常返回内容
      return fetch(request)
    }
  }
}

这个Worker会自动识别已完成过渡的用户,直接返回内容,彻底避免循环问题。

流程示意图

flowchart TD
  用户 --|缓存旧301| aaa.com -->|跳转| bbb.com
  bbb.com --|307+Cookie| aaa.com
  aaa.com --|返回内容| 用户
  用户 --|无缓存/缓存过期| aaa.com --|直接返回内容| 用户

内容的提问来源于stack exchange,提问作者Nick N.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 02:40:08