我有一个要求,我需要支持降级我的服务器代码。
我在我的nginxconfiguration文件中有以下行,表明浏览器可以caching页面,但必须通过服务器validation来检查文件是否更改。
add_header Cache-Control "no-cache";
在我的服务器代码上完成所有升级后,这个设置对我来说工作得非常好。
但是,当把资源降级到旧版本时,当浏览器尝试validation资源更改时,nginx说资源没有改变,所以浏览器显示caching(较新)的资源,而不是降级的(较旧的)资源,资源。
作为一种解决方法,我可以使用以下设置来完全禁用caching,但效率不高,而且我想要caching。
add_header Cache-Control "no-store";
那么如何让nginx识别降级?
在没有caching的情况下,浏览器通常会发出带有GET请求的If-Modified-Since标头,以查看相关文件是否已经从caching副本中更改。
服务器将会:
Nginx将使用它正在服务的文件上的修改时间戳来生成Last Modified标题,并与If-Modified-Since进行比较。
因此,使用touch /path/to/myfile.ext更新文件的时间戳会导致nginx将其标识为在If-Modified-Sincedate之后被修改,并且将允许nginx提供该文件。
或者,您应该能够强制重新获取,在If-Modified-Since的预期date之后,在您的nginxconfiguration中明确指定“Last Modified”标题。 在你的情况下,这基本上需要:
add_header Last-Modified Mon, 09 Jan 2012 17:07:00 GMT 值得一提的一个重点是,如果你的静态资产在这之后改变了,硬编码的头文件将不会反映这个变化(即使你升级你的代码,你仍然需要手动修改configuration。
首先,“无caching”并不一定意味着你在实践中的意思。 我怀疑你真的想用“Cache-Control:max-age = 0,must-revalidate”。 某些浏览器(Firefox)错误地将“no-cache”视为“no-store”的等效物,并且不要在磁盘上caching任何内容。 他们只是在每次页面加载时都从源头重新获取所有内容,这是一个可怕的带宽浪费,并且会让用户体验变差。
其次,你的特定用例正是ETags所devise的,而不是没有它们的简单的仅仅前向date逻辑。 (整个链接网站在caching方面很棒,而不仅仅是电子标签)。
最后,你应该考虑用某种forms的date标识符(或更好的内容散列)来命名你的资源,这样你就不必担心这种事情。 然后,您可以将caching控制设置为1年。 这需要工作stream程的改变和构build脚本,尽pipe许多网站重命名文件和replace链接。 但是,这是谷歌和其他大男孩做…