在Amazon S3上防止不必要的“If-Modified-Since”请求和304响应

时间:2012-02-19 19:23:06

标签: .net asp.net-mvc caching amazon-s3 etag

我正在使用AWS SDK for .NET上传多个图片。在创建PutObjectRequest之前,我分别为远期的时间间隔和日期设置了max-age和expires标头。

这是初始图片请求:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:assets.mywebsite.com.s3-us-west-1.amazonaws.com
If-Modified-Since:Sun, 19 Feb 2012 18:36:48 GMT
If-None-Match:"f19920f9367b698451d6c964d3ae714a"
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11

这是S3响应。它会发送回正确的缓存标头:

Accept-Ranges:bytes
Cache-Control:public, max-age=31536000
Content-Length:9180
Content-Type:image/jpeg
Date:Sun, 19 Feb 2012 19:16:18 GMT
ETag:"f19920f9367b698451d6c964d3ae714a"
Expires:Sat, 19 Feb 2022 18:36:48 GMT
Last-Modified:Sun, 19 Feb 2012 18:36:48 GMT
Server:AmazonS3

但是,每个后续请求仍然会产生304(不是来自缓存的200):

Status Code:304 Not Modified

注意,我没打到F5。

我已经读过,当您混合使用ETag和Expires / Cache-Control时,ETag通常会用于每个请求并完全忽略缓存。我还读到在S3中无法禁用ETag。

我只是想提高速度并降低成本。在我放弃之前,我想我会问SO社区。

关于如何防止304的任何想法?

更新

就缓存而言,浏览器似乎变得越来越复杂。正如marcind所指出的,这是一个客户端浏览器问题。在其他浏览器和不同场景中测试后(即,直接在chrome中加载图像(请求图像URL)而不是在网页存在时简单地查看图像有不同的效果)

1 个答案:

答案 0 :(得分:2)

后续请求的标题是什么?您的客户可能会发送If-Modified-Since或类似内容。

更新:由于您的客户端正在发送If-Modified-Since亚马逊正在做正确的事情。这看起来像是您客户的问题。