目前,我们正在使用一种类似于SE的方法来清除浏览器缓存的资源,例如css和js:https://meta.stackexchange.com/questions/112182/how-does-se-determine-the-css-and-js-version-parameter
无论如何,在测试HTTP标头后,我想知道这到底是什么时候必要的。 这只是90年代留下的遗物,还是有现代浏览器无法读取Last-Modified或ETags HTTP标头?
目前,我们正在使用一种类似于SE的方法来清除浏览器缓存的资源,例如css和js:https://meta.stackexchange.com/questions/112182/how-does-se-determine-the-css-and-js-version-parameter
无论如何,在测试HTTP标头后,我想知道这到底是什么时候必要的。 这只是90年代留下的遗物,还是有现代浏览器无法读取Last-Modified或ETags HTTP标头?
缓存问题
当您试图提供易变的JS或CSS文件且不想/不能(例如使用CDN)依赖HTTP缓存指示头使浏览器请求新文件时。一些旧的浏览器不响应HTTP缓存指示;因此,如果您针对它们,则选择有限。除了旧浏览器外,一些代理服务器会剥离、失效或忽略代理信息,因为它们存在缺陷或它们作为激进的缓存。因此,在这种情况下,使用HTTP缓存控制标头将无法起作用。在这种情况下,您只需确保您的最终用户在按F5之前不会获得奇怪的功能。
易变的JS/CSS资源可以来自通过管理/配置面板可编辑的文件/资源。其中一些原因是主题设置、布局编辑或用于国际化的语言定义文件。
HTTP 1.0
仍然有遗留系统在使用它。考虑到Oracle内置的HTTP服务器(EGP网关)在其RDBMS解决方案中仍在使用它。一些代理将1.1请求转换为1.0。古老的浏览器仍然只支持1.0,但这应该是一个相对不重要的问题。
无论如何,HTTP 1.0使用一组不同的控制机制,与HTTP 1.1相比“原始”。它们包括很多启发式测试,这些测试没有在RFC中指定,以使缓存工作得相当好。在任何情况下,由于提供了过时的内容或请求相同的内容而没有更改,缓存通常会导致奇怪的行为。somefile.js
并不意味着它需要成为文件系统上的真实文件。它可以只是从进程输出的JS。如果该进程需要根据参数输出不同的内容,则GET参数是实现此目的的好方法。更改资源的版本 URL 可以被认为是对此类问题的一种对策。是否认为这值得做就留给读者自己决定了。
结论
有理由在文件请求中添加 GET 参数,但现实情况下(2012 年写作),现在唯一的原因是为了为动态生成的脚本提供输入参数并克服您无法控制缓存标头的问题。
个人只使用它来提供输入参数以供脚本动态输出初始化脚本使用,但像开发中的所有内容一样,总有一些边缘案例会增加合理性。