我的网站上用户生成的图片是通过给它们一个类似于这样的
在来自
如果浏览器具有带有etag的缓存文件,则每当需要显示该文件时,它应该向服务器发送一个请求,并设置
这理论上应该是如何工作的。然而,我发现对于某些浏览器(火狐和IE,默认未测试其他浏览器),情况并非如此。如果用户导航到具有缓存、已标记为etag的图像的新页面,这些浏览器将简单地使用其缓存中的图像而不发送请求。如果用户随后刷新页面,则浏览器将发送带有
所以我的问题是:用户更新其中一幅图像,然后导航到显示该图像的页面。在用户按下
是否有可能解决这个问题?
示例200响应标题:
示例304头部:
src
来提供的:userImage.ashx?id={UserId}&type=avatar
在来自
ashx
文件的响应中,我设置了etag标题。当用户上传新图像时,etag会更改。如果浏览器具有带有etag的缓存文件,则每当需要显示该文件时,它应该向服务器发送一个请求,并设置
If-None-Match
标题的标头。如果缓存的etag与服务器上的当前etag相同,则服务器以未修改-304
响应。如果etag不同,则服务器以正常-200
响应并开始发送新文件。这理论上应该是如何工作的。然而,我发现对于某些浏览器(火狐和IE,默认未测试其他浏览器),情况并非如此。如果用户导航到具有缓存、已标记为etag的图像的新页面,这些浏览器将简单地使用其缓存中的图像而不发送请求。如果用户随后刷新页面,则浏览器将发送带有
If-None-Match
标题的请求。所以我的问题是:用户更新其中一幅图像,然后导航到显示该图像的页面。在用户按下
刷新
之前,缓存的图像将被显示,即使它与新图像的etag不同。当用户按下刷新后,浏览器会发送一个带有If-None-Match
标题的请求,从而触发服务器发送新图像。是否有可能解决这个问题?
示例200响应标题:
Status=OK - 200
Date=Thu, 27 Oct 2011 14:37:31 GMT
Server=Microsoft-IIS/6.0
X-Powered-By=ASP.NET
X-AspNet-Version=4.0.30319
Transfer-Encoding=chunked
Cache-Control=public, max-age=86400
Etag="27/10/2011 13:23:30"
Content-Type=image/jpg
示例304头部:
Status=Not Modified - 304
Connection=close
Date=Thu, 27 Oct 2011 14:39:12 GMT
Server=Microsoft-IIS/6.0
X-Powered-By=ASP.NET
X-AspNet-Version=4.0.30319
Cache-Control=public, max-age=86400
(使用最后修改时间作为ETag更适合以后关于压缩等方面的需求。)