在CSS中清除缓存的图片

4

我的情况
我目前在包含CSS文件时使用缓存破坏,如下所示:

echo "<link href='stylesheet.css?" . filemtime('stylesheet.css') . "' />"

我的目标
现在我想对我在CSS文件中包含的图像做类似的事情。

问题
问题是我不能在我的CSS文件中使用PHP,而我宁愿保持我的CSS文件分离。

我的问题
如何在保持文件分离的同时向CSS文件内的图像添加filemtime()


编辑
我想使用Far Future Expires头来缓存文件。


1
我认为只要您不使用任何脚本来生成CSS样式表,就无法实现。 - tsadiq
2个回答

3
你可以将你的CSS文件重命名为style.css.php并在其中使用PHP。只要后处理结果符合正确的CSS格式,它就应该能够工作。我以前做过这个。不确定是否必要,但如果出现问题,你可以使用header('Content-type...')确保它被发送为CSS文件。

我做了类似的东西(还包括多个CSS文件的引用、压缩以及提供一个缓存的最小化文件副本,同时在开发环境下提供关闭该行为的选项),并且它在任何浏览器中都能完美运行没有任何问题。为了保持我的CSS代码整洁,我在图片URL上使用一个标签(例如img.png?v=CSS_FILE_VERSION),并在服务它们时对CSS标签进行正则表达式匹配(或者在我特定的情况下,当生成CSS文件的最小化版本时)。 - Iain Collins
哦,我想要补充的是,它对于像<div>或<table>子元素中的背景图片特别方便。在某些版本的Internet Explorer中,这些似乎被积极地缓存。 - Iain Collins
这真的是最好的方式吗?我更喜欢保留CSS扩展名。 - Michiel Pater
你可以重新编写 .htaccess 文件,将 CSS 文件视为 PHP 文件,并仍然保留 .css 扩展名。你的 .htaccess 文件应该已经有定义 .php 作为 PHP 文件的内容,所以只需添加另一行来处理 .css 文件即可。 - Jemaclus

2
为了实现“缓存破坏”,最好的方法是发送正确的标头。确保 Apache 已配置为发送一个 “Expires: now” 标头。因此,在 .htaccess 文件中:
Header always set Cache-Control "no-store, no-cache, must-revalidate"
Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT"

这将始终强制不缓存其目录及其下的所有内容。

然而,如果您想有条件地缓存,我建议您采取以下几种方法之一:

  1. 在CSS文件名中包含版本号。因此,您将拥有一个看起来像 mycss.1.cssmycss.2.css 的文件。这需要更多的工作,因为您需要协调两个文件名。但这更好,因为您不会使用PHP发送文件(没有资源消耗),您可以使用CDN(更好),并且仍然可以利用远期过期标头。

  2. 设置Cache-Control: must-revalidate标头和适当的E-Tag标头,这样它只需要在内容未更改时发送304 Not Modified标头...


1
我知道如何实现缓存破坏,请阅读我的问题。-1 - Michiel Pater
1
@Michiel:我确实看了你的问题,并指出有比将修改时间附加到文件名更好、更标准的方法。发送正确的头信息,你就不用担心这个问题了... - ircmaxell
好的,但我想自动更新链接,这样我就可以用相同的名称保存文件。我忘了提到我想使用远期过期标头来缓存文件。顺便说一下,我还没有找到正确的答案。所以你仍然有可能获得最佳答案。 - Michiel Pater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接