http - 如何确保我的用户正在下载我的 S3 文件的新版本?

标签 http caching amazon-s3 etag

这是在 bash 文件中:

s3cmd --add-header='Content-Encoding':'gzip' put /home/media/main.js s3://myproject/media/main.js

这就是我将主干压缩文件上传到 Amazon S3 的操作。 每次更改我的 javascript 文件时,我都会运行此命令。

但是,当我在 Chrome 中刷新页面时,Chrome 仍然使用缓存版本。

请求 header :

Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,es;q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.3
Cache-Control:max-age=0
Connection:keep-alive
Host:myproject.s3.amazonaws.com
If-Modified-Since:Thu, 04 Dec 2014 09:21:46 GMT
If-None-Match:"5ecfa32f291330156189f17b8945a6e3"
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36

响应头:

Accept-Ranges:bytes
Content-Encoding:gzip
Content-Length:70975
Content-Type:application/javascript
Date:Thu, 04 Dec 2014 09:50:06 GMT
ETag:"85041deb28328883dd88ff761b10ece4"
Last-Modified:Thu, 04 Dec 2014 09:50:01 GMT
Server:AmazonS3
x-amz-id-2:4fGKhKO8ZQowKIIFIMXgUo7OYEusZzSX4gXgp5cPzDyaUGcwY0h7BTAW4Xi4Gci0Pu2KXQ8=
x-amz-request-id:5374BDB48F85796

请注意 Etag 是不同的。我对其进行了更改,但是当我刷新页面时,这就是我得到的。 Chrome 仍在使用我的旧文件。

最佳答案

看起来您的脚本已被 Chrome 本身或其他一些临时服务器积极缓存。

如果它是从 HTML 页面调用的 js 文件(听起来确实如此),我见过的一种技术是让页面向文件添加参数:

<script src="/media/main.js?v=123"></script>

<script src="/media/main.js?v=2015-01-03_01"></script>

... 每当 JS 更新时您都会更改它(但会被服务器忽略)。浏览器和任何临时缓存服务器都不会将其识别为相同的,因此不会尝试使用缓存版本 - 即使在您的 S3 服务器上它仍然是相同的文件名。

无论何时发布,您都可以更新此编号/日期/任何内容,最好是在模板引擎可以访问应用程序的发布编号或 ID 时自动更新。

这不是最优雅的解决方案,但如果您发现您使用了乐观的长缓存持续时间,那么使用它会很有用。

显然,这仅在您已将新文件正确上传到 S3 并且 S3 真正发送文件的新版本时才有效。如果您对此有任何疑问,请尝试在 javascript 的 url 上使用命令行实用程序(如 curlwget)来检查是否是这种情况。

关于http - 如何确保我的用户正在下载我的 S3 文件的新版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290802/

相关文章:

caching - 如何缓存离线网络体验的每个调用

c++ - 为什么 vector 和 map 搜索比静态比较慢得多

angularjs - 带有签名 cookie 的 AWS Cloudfront POST 请求

amazon-web-services - AWS S3 : Host override cannot be combined with Dualstack, FIPS 或 S3 加速

javascript - 单击更改 url 而不重新加载

json - 如何实现推送通知?

c# - 如何使用 gzip 压缩 .net 对象实例

amazon-web-services - "Realtime"将大量日志文件同步到S3

http - 如何通过管道将 Vertx 请求直接流式传输到文件

java - 如何让 clojure 向套接字写入响应?