10

为了刷新缓存中的 CSS 文件,我经常使用 file.css?version=DDMMYYYY 技巧。但是,我对这种方法有疑问。

我正在使用旧的外联网。所有页面都使用相同的 CSS 文件。Extranet 没有任何模板文件,并且这个 css 包含在 Extranet 的每个页面中。我需要为所有外联网页面刷新这个 css 文件。

我的问题是:我想在登录页面上使用 file.css?version=DDMMYYYY 技巧。其他页面仍将包含 file.css(没有 ?version 部分)

如果用户进入登录页面,他将收到新版本的 css 文件。但是其他页面将使用哪个版本?旧版本 (file.css) 还是新版本 (file.css?version=DDMMYYYY) ?

换句话说,当用户进入登录页面时,哪些文件将在他的缓存中:

  • file.css 和 file.css?version=DDMMYYYY
  • 只有file.css,更新到新版本

对于这个初学者问题,我很抱歉,但我自己测试它有一些困难。

谢谢你的帮助!

4

3 回答 3

9

当文件被缓存时,它将带有完整的 url,包括?后面的内容。缓存标头由服务器提供并由浏览器遵守。

本质上

file.css?version=DDMMYYYY

file.css

是浏览器的 2 个单独文件,没有任何连接。

我对您的建议是在所有页面上始终使用新网址。

于 2012-12-20T17:05:46.543 回答
3

这不起作用,它们将被不同地缓存,尽管它们是文件系统file.cssfile.css?version=DDMMYYYY的同一个文件,它们是不同的 URI,服务器响应可能完全不同......所以,file.css可以同时从缓存中加载旧文件你得到正确的文件file.css?version=DDMMYYYY

防止这种情况的一种方法可能是完全禁用缓存,这会导致每次加载页面时都会下载 css 文件,但会为您提供即时更新,或者您可以将缓存设置为在短时间内过期,例如 10 分钟, 2 小时,因此它将每 10 分钟/2 小时下载一次...

如果您使用启用了 htaccess 的 apache,您可以这样做来禁用缓存:

<filesMatch ".(html|htm|js|css)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>
</filesMatch>
于 2012-12-20T17:07:30.493 回答
0

在我的项目中,我还使用 ?version 方法强制浏览器获取新版本的 CSS 文件。而不是使用 ?version=DDMMYYYY 我建议使用 filemtime()。

例子:

<link rel="stylesheet" href="css/custom.css?<?php=filemtime('css/custom.css')?>" type="text/css" media="screen" />

函数 filemtime() 获取文件修改时间,因此当 CSS 文件更改时浏览器将获取新版本的 CSS。如果文件未更改,则时间保持不变,浏览器使用文件的缓存版本。

于 2014-10-12T10:23:10.043 回答