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

TIM*_*MEX 5 etag caching http amazon-s3

这是在bash文件中:

s3cmd --add-header='Content-Encoding':'gzip' put /home/media/main.js s3://myproject/media/main.js
Run Code Online (Sandbox Code Playgroud)

这就是我将骨干压缩文件上传到Amazon S3的过程.每次我更改我的javascript文件时都会运行此命令.

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

请求标头:

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
Run Code Online (Sandbox Code Playgroud)

响应标头:

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
Run Code Online (Sandbox Code Playgroud)

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

use*_*889 9

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

如果它是从HTML页面调用的js文件(听起来像它),我看到的一种技术是让页面向文件中添加一个参数:

<script src="/media/main.js?v=123"></script>
Run Code Online (Sandbox Code Playgroud)

要么

<script src="/media/main.js?v=2015-01-03_01"></script>
Run Code Online (Sandbox Code Playgroud)

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

每当您执行发布时,您可以更新此数字/日期/任何内容,理想情况下,如果模板引擎可以访问应用程序的版本号或ID,则可以自动更新.

这不是最优雅的解决方案,但如果你发现你已经使用了一个乐观的长缓存持续时间,它就很有用.

显然,这只有在你正确地将新文件上传到S3并且S3真正发送新版本的文件时才有效.尝试使用这样的命令行实用程序curlwget上的JavaScript的网址是否是这样的话,如果你对此有任何怀疑.