全站历史缓存资源零死链迁移的关键是保持旧URL可访问、用immutable策略固化静态资源缓存、HTML动态适配路径并设短缓存、Nginx兜底重定向404请求。

品牌更名时,浏览器缓存导致的“死链”本质是用户本地还存着旧域名下的 JS、CSS、图片等资源,而这些资源在新站已不可达(比如旧域名停用、路径变更或 CDN 域名失效)。要实现全站历史缓存资源零死链迁移,关键不是清除用户缓存(做不到),而是让旧缓存仍能被正确加载并平滑过渡。核心思路是:保持旧资源 URL 可访问性 + 控制缓存行为节奏 + 提供降级兜底。
保持旧静态资源 URL 持续可访问
用户浏览器里缓存的 `https://old-brand.com/app.js?v=1.2` 一旦失效,就会报 404 或 CORS 错误。必须让这个地址在迁移期继续返回有效内容:将旧域名(如 old-brand.com)的静态资源服务保留至少 3–6 个月,哪怕只是作为反向代理指向新 CDN 或新源站;
若旧域名已停用,可在 Nginx 中配置 跨域代理回源:
location ~* \.(js|css|woff2|png|jpg|gif|svg)$ {
add_header Access-Control-Allow-Origin *;
proxy_pass https://cdn.new-brand.com/;
proxy_set_header Host cdn.new-brand.com;
}
这样旧 URL 不变,内容由新源实时供给,浏览器无感知。
静态资源强制启用 immutable 缓存策略
避免用户因刷新、导航重载而意外拉取旧 HTML 后又卡在旧 JS 里:对所有静态资源响应头统一加:
add_header Cache-Control "public, immutable";
该策略告诉浏览器:只要 URL 不变,就永远不用再校验(不发 If-None-Match / If-Modified-Since);
配合资源文件名哈希化(如 app.a1b2c3.js),确保每次更新都生成新 URL,旧缓存自然失效;
⚠️ 切勿对 HTML 使用 immutable —— 它必须每次请求都新鲜获取,才能控制后续资源加载逻辑。
HTML 层动态适配旧缓存资源路径
即使用户缓存了旧 HTML,也要让它能加载新资源:在旧 HTML 的 `
` 中插入内联脚本,检测当前域名并自动修正资源 base:<script>
if (location.hostname === 'old-brand.com') {
document.write('<base href=\"https://new-brand.com/\">');
}
</script>
或更稳妥地,在 Nginx 中用 sub_filter 动态替换:
sub_filter 'https://old-brand.com/' 'https://new-brand.com/';
sub_filter_once off;
expires 10s;
配合短缓存(10 秒),既避免 HTML 长期滞留,又给灰度切换留出窗口。
兜底:404 资源自动 fallback 到新地址
防漏网之鱼——极少数未命中 sub_filter 或代理规则的请求:在 Nginx 中配置 error_page 捕获静态资源 404,并透明重写为新域名路径:
location ~* \.(js|css|png|jpg|woff2)$ {
try_files $uri @fallback_new;
}
location @fallback_new {
rewrite ^(.*)$ https://new-brand.com$1 redirect;
}
注意:这里用 redirect 是为了触发浏览器重发请求(带新 Referer 和 Cookie),而非内部 proxy_pass —— 否则跨域资源可能因 Origin 头不匹配被拦截。


















