Javascript 强制浏览器仅缓存图像(而不是脚本和链接)

Javascript 强制浏览器仅缓存图像(而不是脚本和链接),javascript,php,html,css,caching,Javascript,Php,Html,Css,Caching,我维护一个定期更新和风格变化的网站。在这些更改之后,我的客户通常会抗议我以某种方式“破坏”了他们的网站,纯粹是因为他们的浏览器缓存了旧的CSS样式表和/或脚本,有时甚至在刷新之后 这个问题()解释了我如何用我掌握的任何一种技术来解决这个问题,但我不想要一个无缓存的解决方案,我希望浏览器能够维护图像,尤其是那些很少改变的较大图像 这是否可以使用PHP、HTML甚至JavaScript实现 请叫我OCD,但我不希望每次内容发生更改时都修改文件名(尽管我愿意这样做),我正在寻找一种控制机制(如果存在的

我维护一个定期更新和风格变化的网站。在这些更改之后,我的客户通常会抗议我以某种方式“破坏”了他们的网站,纯粹是因为他们的浏览器缓存了旧的CSS样式表和/或脚本,有时甚至在刷新之后

这个问题()解释了我如何用我掌握的任何一种技术来解决这个问题,但我不想要一个无缓存的解决方案,我希望浏览器能够维护图像,尤其是那些很少改变的较大图像

这是否可以使用PHP、HTML甚至JavaScript实现

请叫我OCD,但我不希望每次内容发生更改时都修改文件名(尽管我愿意这样做),我正在寻找一种控制机制(如果存在的话)


我知道这可以通过Apache Expires模块实现(如下所述:),但我的客户端使用的托管帐户似乎并不授予我这样做的权限,如果我诚实的话,我远不是Apache专家。

您可以在PHP脚本中使用缓存。创建一个PHP脚本,并将图像名称作为参数传递

在php脚本中,只需使用header()函数来控制浏览器缓存。在标头函数中设置缓存过期时间。As浏览器通过HTTP头维护缓存

然后在发送用于缓存控制的标头之后。发送另一个图像头,发送图像头后,读取图像的原始内容,只需以二进制流的形式发送图像内容的输出

下面是一个很好的代码示例

快乐编码
Atul Jindal

如果您无权访问Apache配置本身,可以尝试通过
.htaccess
文件设置过期规则。与流行的观点相反,不仅重写规则,而且任何Apache配置规则都可以包含在其中……如果Apache配置允许的话。但是,值得一试

要仅缓存某些文件,可以使用如下指令:

<FilesMatch "\.(ico|pdf|jpg|png|gif|js|css)$">
  Header set Cache-Control "max-age=172800, public, must-revalidate"
</FilesMatch>

标题集缓存控制“最大年龄=172800,公共,必须重新验证”
(您可以删除不希望缓存的扩展,然后添加其他扩展。)

现在,对于CSS和JS,通常建议您执行以下操作:不更改文件名本身,只需通过向这些文件添加(无意义的)查询字符串来更改对这些文件的引用即可

例如,在嵌入JS文件时,按如下方式执行:

<script src="/path/to/file.js?rev=123" type="text/javascript"></script>


下次更新该文件时,只需增加
rev
编号。

使用etags并确保上次修改是正确的,并且它应该能够自动工作,而不必担心过期,如果使用不正确,它可以将url锁定到某个版本中很长一段时间。谢谢@lxg,从我最初的阅读来看,我可以在.htaccess中使用多个
标记。在这种情况下,我认为类似的东西可能会起作用:
头集缓存控制“max age=172800,public,必须重新验证”
头集过期“Thu,2012年4月15日20:00:00 GMT”头未设置ETag文件ETag None
不确定.gz位!我从大卫·沃尔什那里偷来的:有趣的是,他删除了
ETag
s。根据我的经验,它们不会造成任何伤害,但他无疑是这方面的专家。(编辑:我刚刚检查过,谷歌也没有设置ETag头。)至于
.gz
,你基本上可以添加静态文件的任何文件扩展名,这些扩展名不会经常更改。如果您想包括所有可能的扩展,那么这个列表将变得非常长。