ETags,IIS7,内核缓存策略(enableKernelCache)

6

两个相关问题:使用IIS7默认的ETag策略时,为什么我们在浏览网页时看不到If-None-Match/304交互?

例如,对于空缓存请求返回的标头如下:

Content-Type    image/png
Last-Modified   Thu, 03 Dec 2009 15:51:56 GMT
Accept-Ranges   bytes
Etag    "a8a0628a3074ca1:0"
Server  Microsoft-IIS/7.0
X-Powered-By    ASP.NET
Date    Tue, 22 Dec 2009 19:47:36 GMT
Content-Length  1780

为什么再次访问该页面时,图片不会生成304往返呢?

此外,IIS7的默认applicationHost文件如下(1):

   <caching enabled="true" enableKernelCache="true">
   </caching>

enableKernelCache='true' 是否适用于所有静态文件,使您无需显式注册扩展名即可授予内核策略(2)中的 CacheUntilChange

<caching>
  <profiles>
    <add extension=".gif" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".png" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".js" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".css" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".jpg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
    <add extension=".jpeg" policy="DontCache" kernelCachePolicy="CacheUntilChange" duration="0.00:01:00" location="Any" />
  </profiles>
</caching>

(1) %systemroot%\System32\inetsrv\config\applicationHost.config

(2) 在IIS 7上配置缓存过期时间的方法

1个回答

4
处理ETags及其相关的If-None-Match / If-Modified-Since功能在不同浏览器中有所不同。您可以尝试使用几种不同的浏览器并查看会发生什么情况-通常情况下,如果您没有设置显式过期时间,我会期望看到304状态码,就像您所说的那样。
对于内核缓存,默认情况下启用静态文件缓存。为了帮助查看正在发生的情况,我发现运行以下命令非常有用:
netsh http show cachestate

这将显示当前缓存中的文件信息。

请注意,通常需要在一定时间窗口内多次引用文件,内核才会将它们缓存。


谢谢,Rick;我已经尝试过IE8和FF 3.5,并发现这种行为有点奇怪 - 它在哪里有文档记录? IIS7(OOTB)不会发出到期标头,只有ETag;但是对页面的后续请求却不会为这些对象生成304s? - Nariman
我所知道的唯一文档是HTTP规范。我想知道你是否看到了每个会话的优化。你尝试过退出浏览器(所有窗口),重新启动,然后查看是否会出现304吗?有没有公共页面可以让我看到你所描述的行为? - RickNZ
由于原始响应没有Cache-Control头,浏览器在缓存方面(有点)自由。在这种情况下,它选择在会话期间缓存图像。如果您在其中打开了您的网站的IE8选项卡,然后关闭该选项卡,然后打开一个新选项卡并返回到同一页,则会看到所有图像的IMS / INM请求和304响应。 - RickNZ
有趣的是,在FF3.5.7中,即使在新会话中也不会发出请求。我很想知道他们的默认设置(“当页面过期时检查新版本”)实际上与ETag响应有什么关系(http://kb.mozillazine.org/Browser.cache.check_doc_frequency)。 - Nariman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接