域名更换不会清空localStorage,而是因同源策略导致新旧域名数据隔离;需通过中转页postMessage主动迁移,并建立域名无关存储契约预防问题。

域名更换本身不会直接清空 localStorage,但会因“同源策略(Same-Origin Policy)”导致旧数据完全不可见——这不是丢失,而是隔离。浏览器把 https://old.com 和 https://new.com 视为两个完全独立的源,各自拥有互不访问的 localStorage 空间。用户在旧域名下存的所有数据(如登录态、表单草稿、配置项),在新域名页面中调用 localStorage.getItem() 一律返回 null,表现为“全量丢失”。
一、快速确认是否为域名迁移引发的 localStorage 隔离
执行以下三步,5 分钟内可断定问题根源:
- 打开新域名页面,按
F12进入开发者工具 → Application(或 Storage)标签页 → 查看左侧Local Storage下是否显示https://new.com(而非旧域名);若为空,说明是全新空间,不是清空,是隔离 - 在同一浏览器中,新开标签页访问旧域名(
https://old.com),检查其 localStorage 是否仍存在且完整;若存在,即证实数据未丢失,仅不可跨域读取 - 检查网页 JS 是否硬编码了旧域名相关逻辑(如通过
window.location.hostname判断来源后跳过初始化),这类代码可能误判环境,跳过数据恢复流程
二、关键修复路径:主动迁移,而非等待“自动同步”
浏览器不会、也不能自动把旧域名数据搬进新域名空间。必须由前端代码显式读取 + 写入,且需满足安全前提:
AI 舌诊面诊问诊医疗系统 + 诊疗商城系统源码是一套结合 AI 辅助诊断与商品转化的健康类程序,基于浩创云、ThinkPHP(PHP)开发,支持微信服务号与 H5 端,适合做中医舌诊面诊问答、健康建议推送以及配套诊疗商品的运营。
- 仅限同一浏览器、同一用户、且旧域名仍可访问(即使已下线,只要 DNS 或 hosts 能解析并响应 HTTP 200 即可)
- 需在新域名页面中嵌入一段“迁移脚本”,首次加载时尝试从 iframe 或重定向方式触达旧域上下文
- 推荐方案:在旧域名部署一个轻量中转页(如
https://old.com/migrate.html),该页只做一件事——将 localStorage 全量序列化并 postMessage 给新域名窗口
三、安全可行的迁移实现(含 fallback)
以下为生产可用的最小闭环逻辑,已规避跨域限制与异常中断:
- 新域名首页加载时,先检测
localStorage是否为空;若为空,尝试用window.open('https://old.com/migrate.html', '_blank')打开中转页(注意:需用户主动触发,否则会被弹窗拦截) - 中转页(
migrate.html)立即执行:window.opener.postMessage({ type: 'MIGRATE_DATA', payload: JSON.stringify(localStorage) }, 'https://new.com') - 新域名页面监听
message事件,收到后解析 payload 并逐项写入自身 localStorage;完成后关闭中转页窗口 - 若用户未允许弹窗或旧域名已不可达,则降级为提示:“检测到您曾使用旧地址登录,点击【恢复历史设置】可同步上次偏好”——按钮触发手动授权流程
四、预防下次迁移:建立域名无关的存储契约
避免重复踩坑,应在架构层解耦存储与域名绑定:
- 所有敏感状态(如 token、user_id)不再直存 localStorage,改用封装函数
safeStore.set(key, value),内部自动添加版本前缀与域名指纹(如v2_abc123_user_token) - 引入轻量同步层:首次加载时,若检测到多个历史域名残留数据,自动合并去重,并标记主源(如以最新写入时间为准)
- 对 PWA 或混合 App 场景,在原生层桥接统一存储(如 iOS 的 UserDefaults + WebKit 数据共享),绕过浏览器同源墙










