2010-11-04 92 views
6

我有一个系统,其中缓存max-age设置为0,并有问题,当我在我的style.css中做了一些更改失败更改不apear到客户端。浏览器将使用css的旧缓存版本。 我有一个简单的问题:命名为style.css?123的css文件将被缓存为新的?Css文件缓存

+0

你使用IIS服务器还是Apache? – 2010-11-04 10:03:25

回答

15

是的,向资源的URI添加唯一的查询字符串将强制客户端获取“新鲜”版本(因为客户端不知道它仅仅是一个更新以前的缓存资源)。这被称为指纹并且您通常使用CSS文件的时间戳或递​​增版本号。

Google Web Fundamentals在HTTP cache optimization上有一篇很棒的文章。尤其是标题为“无效和更新缓存的响应:”

你如何获得两全其美的:客户端缓存和快速更新?您可以更改资源的URL,并强制用户在其内容更改时下载新的响应。通常,您可以通过在其文件名中嵌入文件的指纹或版本号(例如,样式)来执行此操作。 x234dff .css。

请注意,指纹不需要是序列号。任何价值 - 散列,版本等 - 只要碰撞风险有限,就会这样做。


1)这是怎么在这里做了SO,例如http://sstatic.net/js/global-login.js?v=12

+0

显然,使用查询字符串参数是不好的。请参阅http://stackoverflow.com/a/13377291/637609 – 2012-11-14 10:56:01

+0

你能否更新缓存优化链接? – shankbond 2016-09-29 11:08:19

+0

@shankbond完成。 – jensgram 2016-10-02 17:52:16

0

是的,在每个style.css文件中追加查询字符串参数将强制它再次缓存。
,因为浏览器会将每个静态组件与其url进行缓存,所以当url更改时,新文件将被缓存。

+0

显然,使用查询字符串参数是不好的。请参阅http://stackoverflow.com/a/13377291/637609 – 2012-11-14 10:56:57

0

你就可以欺骗浏览器以为它是一个新的样式表,每一秒的时戳你的CSS:

<link rel="stylesheet" type="text/css" href="style.css?<?php echo date('l jS \of F Y h:i:s A'); ?>" /> 

,这将给你这样的:

<link rel="stylesheet" type="text/css" href="style.css?Thursday 24th of April 2008 04:45:21 PM" /> 

来自Can We Prevent CSS Caching?

+0

显然,使用查询字符串参数是不好的。请参阅http:// stackoverflow。com/a/13377291/637609 – 2012-11-14 10:57:31

1

您可以附加一个唯一的查询字符串,虽然这会使用带宽。

可以重命名每次做出改变时你的CSS文件,IE:

主v1.css 主v2.css 主v3.css

,然后重新引用它在你的网页中。这节省了带宽并迫使浏览器重新加载它。

+0

'main.css?v1'如何使用比'main-v1.css'更多的带宽? (我想我误解了你的答案。) – jensgram 2010-11-04 10:19:15

+0

main.css?v1实际上是相同的,我的意思是用于日期标记,它会每一次加载它,当你只有在需要加载时才会加载它。每次更改都以不同方式命名css文件,或者添加版本号查询字符串是2种最佳方式。 – 2010-11-04 10:34:59

+0

显然,使用查询字符串参数是不好的。请参阅http://stackoverflow.com/a/13377291/637609 – 2012-11-14 10:58:56