什么时候基于文件名的浏览器cachebusting实际需要?

时间:2012-12-07 18:43:04

标签: javascript css caching header

目前,我们正在使用一种方法以类似于SE的方式破坏浏览器缓存资源(如css和js):https://meta.stackexchange.com/questions/112182/how-does-se-determine-the-css-and-js-version-parameter

无论如何,在使用HTTP Headers进行一些测试之后,我想知道这实际上是什么时候需要的。这只是90年代遗留下来的遗物,还是现代浏览器无法读取Last-Modified或ETags HTTP标头?

1 个答案:

答案 0 :(得分:4)

缓存问题

当您尝试为易失性的JS或CSS服务时,您不希望/不能(例如使用CDN)依赖HTTP缓存指令标头来使浏览器请求新文件。一些旧的浏览器不响应HTTP缓存指令;因此,如果您要定位它们,则选项有限。 Baring较旧的浏览器一些代理服务器剥离或无效或忽略代理信息,因为它们是错误的或它们充当侵略性缓存。因此使用HTTP缓存控制标头将不起作用。在这种情况下,您只需确保最终用户在达到F5之前不会获得奇怪的功能。

易失性JS / CSS资源可以来自可通过管理/配置面板编辑的文件/资源​​。其中一些原因是用于国际化的主题,布局编辑或语言定义文件。

HTTP 1.0

有遗留系统使用它。考虑到其RDBMS解决方案中的Oracle内置HTTP服务器(EGP网关)仍然使用它。一些代理将1.1请求转换为1.0。古代浏览器仍然只支持1.0,但如今这应该是一个相对不成问题的问题。

无论如何,HTTP 1.0使用了一组与HTTP 1.1提供相比“原始”的不同控制机制。它们包括许多未在RFC中指定的启发式测试,以使缓存工作得相当好。在任何一种情况下,缓存都会导致奇怪的行为,因为过时的内容被传递或者相同的内容是请求而没有变化。

关于编译指示的说明:无缓存

仅适用于请求而不是响应;人们不知道的常见事情。它旨在防止中间系统缓存敏感信息。它仍然在HTTP 1.1中具有向后支持,但不应该使用它,因为它已被弃用。

...除非微软称IE不这样做:http://support.microsoft.com/kb/234067

生成内容的输入

另一个原因是基于输入参数生成的JS或CSS。仅仅因为URL包含somefile.js并不意味着需要成为文件系统上的真实文件。它可能只是JS从进程输出。如果该过程需要根据参数输出不同的内容,那么GET参数是实现这一目标的好方法。

考虑页面版本控制。在可以保留页面以满足历史或业务需求的大型应用程序中,它允许存在相同的命名资源,但是如果需要特定版本,则可以根据需要提供它。您可以将每个版本保存在不同的文件中,也可以创建一个输出正确版本更改的正确内容的过程。

旧浏览器问题

在IE6中,AJAX请求将受浏览器缓存的影响。如果您要求的服务是由于没有更改的URL而无法控制,则向URL添加一个简单的随机字符串将绕过该问题。

浏览器缓存选项

如果我们考虑使用HTTP {1.1}上的RFC,我们也会看到:

  

许多用户代理使用户可以覆盖基本代理      缓存机制。例如,用户代理可能允许用户      指定缓存的实体(甚至是明确陈旧的实体)      从未验证过。或者用户代理可能习惯性地添加“Cache-      对每个请求控制:max-stale = 3600“。用户代理不应该      默认为非透明行为或导致的行为      在异常无效的缓存中,但可以明确配置      通过用户的明确行动来做到这一点。

更改资源版本控制的URL可被视为此类问题的对策。无论你认为它值得,我都会留给读者。

<强>结论

有理由将GET参数添加到文件请求中,但实际上现在这样做的唯一原因(截至2012年)是为动态生成的脚本提供输入参数并克服无法控制缓存的问题头。

我个人仅用于为动态输出初始化脚本的脚本提供输入参数,但就像开发中的所有内容一样,总有一些边缘情况会增加原因。