版本CSS和JS URL的最佳方法是什么?


26

根据Yahoo广为宣传的“加速站点最佳实践”,我们使用远期缓存过期标头提供来自CDN的静态内容。当然,我们有时需要更新这些“静态”文件,因此,我们目前在文件名中添加了一个中缀版本(基于文件内容的SHA1总和)。从而:

styles.min.css

成为:

styles.min.abcd1234.css

但是,管理版本控制的文件可能会变得乏味,我想知道GET参数表示法是否会越来越好:

styles.min.css?v=abcd1234

您使用哪个?为什么?我应该考虑与浏览器或代理/缓存相关的注意事项吗?


我问的原因是,我似乎想起了听到不使用GET参数样式的原因,但我不记得为什么。
— David Eyk,2010年

使用GET参数是否不要求使用某种服务器端脚本(不再是静态的)来为样式表提供服务?
— Lotus Notes 2010年

@Lotus:您可以发送GET参数,如果什么也没有寻找,它们将被静默忽略。
— David Eyk,2010年

Answers:


10

根据Google的“使网络变得更快”,许多HTTP代理服务器不会缓存带有查询参数的页面。

大多数代理(最著名的是通过3.0版Squid up)都不会使用“?”来缓存资源。即使Cache-control: public响应中包含标头,也要在其网址中添加。要为这些资源启用代理缓存,请从对静态资源的引用中删除查询字符串,然后将参数编码为文件名本身。

因此styles.min.abcd1234.css是首选的解决方案。您可以使用适当的URL重写机制来简化透明styles.min.abcd1234.css实现styles.min.css?v=abcd1234。

如果仅支持HTTPS,则该建议将不适用,因为代理通常无法缓存通过SSL提供的页面。


2
我想知道有关查询字符串缓存和代理服务器的信息是否过时?在这种情况下,Google的文档不再引用查询字符串和代理服务器。尽管示例仍然涉及更改文件名本身。据报道,Squid 2.7(2008)和3.1(2010)默认情况下支持查询字符串缓存,并且可以配置早期版本来支持此功能。
— MrWhite 2015年

15

使用GET样式版本控制,从空白缓存中,多个URL(例如style.css?v=123和style.css?v=456)将返回相同的内容。但是我看不到这会有问题,尤其是因为您一次只能链接到一个。

我认为您会发现GET样式更易于维护。您不需要单独的文件:只需更改URL,浏览器就会重新获取CSS。

更新:在进一步的研究中,似乎使用查询字符串可能会停止浏览器缓存文件。但是,如果您返回诸如此类的正确标题,Expires则不会有问题。

更新2:可接受的答案指出,某些代理不使用查询字符串缓存文件。但是,这是基于旧的信息。他们在Squid中提到的特定问题已在7年前解决。令人印象深刻的网站对此做了很好的记录。


那是我要记住的警告。感谢您的链接。
— David Eyk,2010年

1

两者都一样有效,因为查询字符串被认为是URL的一部分,并且通过更改它实际上是在更改资源的名称,从而导致浏览器获取文件的新副本。

我说无论使用哪种方法都比较容易维护。


0

这不是上述问题的答案,我想要一个更好的解决方案,所以我在这里自己问

这两种方法都需要修改引用css和js文件的文件。因此,实际上,进行更改后,将需要重新启动应用程序服务器。

有没有更好的方法可以处理静态文件的版本而无需重新启动应用程序服务器?

解决方案中排除以下情况

  • 更改css和js文件名
  • 在网址中传递查询参数

该解决方案也不应影响设置缓存控制或过期。

谢谢


1
看来您是新来的。这是一个很好的问题。您应该这样发布,也许可以链接回该问题以供参考。我已标记为引起主持人注意,以便他们可以为您提供帮助。
— David Eyk,2011年

正如David所指出的,此站点与其他论坛站点不同。如果您有新问题要问,请随时单击“问问题按钮”
— Mark Henderson

这是一个有用的说明。如果更改样式表,最好保持名称和引用相同,而不要在整个站点上更新数百个对其的引用。
— Mark Stosberg 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.