-
Notifications
You must be signed in to change notification settings - Fork 6
IIS 合理配置缓存 #197
Description
最终结论
对于静态文件,IIS 自己会处理缓存相关事宜,无需手动配置。
初始研究
关键词:iis 8 cache。
官方文档:Caching 。
相关讨论:Browser Caching using IIS8.5, am I doing it right?
深入研究
添加缓存的方式
查看 IIS 的 输出缓存 部分,发现只能给每种文件扩展名添加缓存,没法给指定目录添加缓存。
两种缓存分类
然后缓存分为两种:用户模式缓存和内核模式缓存。
Google iis user-mode caching vs kernel-mode caching 之后,看到这篇解释:difference between kernel mode and user mode caching in IIS 8.0。简单来说,内核模式缓存会直达最基础的系统层面,不会触及 IIS 和 ASP.NET,所以 IIS 相关的验证/授权和其他设置都无法应用到内核模式缓存上。但是从另一个方面来看,内核模式缓存肯定是更快的。
至于具体什么情况下内核模式缓存无效,可以查看 MSDN 上的这篇文档:Instances in which HTTP.sys doesn't cache content。
缓存过期方式
一种方式是 文件更改通知,文件如果没有变化,缓存就不更新。
另一种方式是 时间间隔,也就是指定时间之后缓存失效。
另外对于 用户模式缓存 来说,还可以根据 查询字符串变量 和 HTTP 标头 来缓存文件的多个版本,这个后面有空了再深入研究一下。
添加的缓存类型
- 页面文件:html/js/css
- 图片文件:jpg/png
- 音视频文件:m3u8/ts
- 字体文件:woff/woff2/ttf
- 文档:docx/pptx/pdf/rar/zip
实际应用
最开始添加的是内核模式缓存,然后在浏览器中调试页面,取消“跳过缓存”选项,发现刷新之后服务端返回的还是更改前的页面。
于是又给所有文件类型再添加用户模式缓存,然后再刷新页面,这回浏览器终于可以在不刷新缓存的情况下,拿到更新后的页面了,查看 Etag 字段也是更新了的,看来还是得用户模式缓存才行,或者是两种缓存都启用。
问题探讨
上图中官方文档说不建议给静态文件设置缓存,那怎么让 IIS 在静态文件在修改后及时返回最新的文件呢?
之后在 IIS 的缓存设置中,配置 .html 在两种模式下都不缓存,然后修改页面,并在浏览器中不跳过缓存地刷新页面,结果也能看到修改后的页面。
然后在官方文档 When to Use Output Caching | Configure IIS 7 Output Caching 中,看到了下面这段话:
也就是说静态内容 IIS 自己会缓存,也会刷新修改后的缓存。于是在 IIS 中把所有静态文件的缓存设置都删除,然后重启 IIS 根节点,并修改 HTML 页面里的内容。每次修改后都用微信扫码,结果真的显示的是最新的内容!
这么说的话,之前的缓存设置其实是没有必要的?那就先把静态文件的缓存设置删掉,以后再看情况决定是否再启用。
旧的记录:

