如何修复浏览器缓存导致的域名切换301重定向循环
解决301缓存导致的域名重定向循环问题
问题背景
我拥有两个域名aaa.com(已接入Cloudflare)和bbb.com(托管于其他服务商),此前长期将aaa.com通过301重定向指向bbb.com。现在计划将aaa.com设为主域名,但用户浏览器缓存了旧的301规则,导致访问时出现aaa.com→bbb.com→aaa.com的重定向循环,需要无需用户手动清缓存即可自动打破循环的方案。
核心思路
301是永久重定向,浏览器会长期缓存该规则,因此需要通过临时过渡策略逐步覆盖旧缓存,同时避免新的循环:
- 让主域名
aaa.com直接提供内容,不再跳转; - 让原域名
bbb.com通过临时重定向+Cookie标记的方式,引导缓存用户过渡到aaa.com,并避免重复循环; - 待旧缓存周期过后,再切换为永久重定向完成收尾。
分步解决方案
1. 调整aaa.com的Cloudflare配置
- 移除所有指向
bbb.com的301重定向规则,确保aaa.com直接返回完整网站内容; - 添加页面规则,为
aaa.com设置缓存控制头,强制浏览器不缓存重定向相关响应:
这一步会让后续用户访问Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Expires: 0aaa.com时,浏览器不再保留旧的301缓存规则。
2. 修改bbb.com的重定向逻辑
将bbb.com的重定向改为条件式临时跳转,用Cookie标记已完成过渡的用户:
- 当请求
bbb.com时,先检查是否存在自定义Cookiedomain_switch=done:- 若存在:直接返回网站内容,或显示静态提示页引导用户访问
aaa.com(避免再次跳转循环); - 若不存在:返回307临时重定向到
aaa.com,同时设置Cookie:
(Max-Age设为30天,覆盖绝大多数浏览器对301的缓存周期)Set-Cookie: domain_switch=done; Path=/; Max-Age=2592000; SameSite=Lax
- 若存在:直接返回网站内容,或显示静态提示页引导用户访问
- 选择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.
相关产品推荐
相关产品推荐

