答案1
使用资产版本控制。
您的网站的 V1 将引用/v1/js/app.js,/v1/img/logo.png, ETC。
当你推送新版本时,它将引用/v2/js/app.js,/v2/img/logo.png, ETC。
这样,客户仍然需要参考v1由于某些缓存内容,资产可以这样做,并且不会因失效而中断。新访客将获得全部-v2内容,不会被任何v1到处都是东西。
最终一天后,你可以删除并使其无效v1,但这不是一个时间敏感的任务。
当然,您不必使用 v1、v2 等,如果您愿意,可以使用 git hash 或者 date 或其他内容。
更新:正如@Michael-sqlbot 在评论中指出的那样根对象返回“GET /”是一种特殊情况,因为它不会从这种基于路径的版本控制中受益。您有几个选择:
为根对象设置一个较短的过期时间,例如 5 分钟。这样,它将在您上传新网站版本后不久自动过期。
或者上传新版本并使其无效
/index.html
- 这比使数千个文件资产无效要快得多,也便宜得多。
在这两种情况下,从所有 CloudFronts 上传 V2 和过期 V1 之间会有短暂的重叠,/index.html
但没关系因为所有 V1 资产仍然可用。无论您的访问者在此期间收到 V1 还是 V2 index.html,他们仍将获得一个可正常运行的网站。
希望有帮助:)