【问题标题】:Force browser to recache image on picture强制浏览器在图片上缓存图片
【发布时间】:2018-08-17 10:33:07
【问题描述】:

我有缩略图 PHP 脚本,它可以重新制作缩略图。在加载缩略图之前一切正常,浏览器无法从服务器重新加载图像并显示旧缩略图。我尝试了以下技巧:

  header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
  header("Cache-Control: no-store, no-cache, must-revalidate");
  header("Cache-Control: post-check=0, pre-check=0", false);
  header("Pragma: no-cache");

还有元标记:

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Expires" content="Tue,01 Dec 1990 06:30:00 GMT">

问题是,我做错了什么还是有其他方法?我知道在图像末尾添加“?randomnumber”技巧。但是,我真的不想使用它,因为这意味着浏览器会缓存大量图像以及让事情看起来很乱。而且我没有真正的方法来可靠地获得缩略图编辑日期。

【问题讨论】:

  • 这可能是因为您的服务器未配置为执行此操作,请查看 .htaccess 文件:stackoverflow.com/a/11724596/5374294
  • 除非您真的想完全禁用缓存,否则我建议将"file modified" timestamp 附加到 URL(而不是随机数)。这样,只有自上次加载后未更改的文件才会从缓存中加载。
  • @showdev 到目前为止,这似乎是最好和最优雅的方式。谢谢

标签: php html apache caching


【解决方案1】:

缓存对您与响应一起发送的标头进行操作,如果缓存已经有一个资源副本,说明其标头未过期,那么它没有理由查看上游,也没有多少麻烦后续响应的标题会改变这一点。

这就是 HTTP 的工作原理。

如果您希望显示新版本的缩略图,您可以:

  1. 只发送足够小的缓存标头,这样您就不会像这样自爆。
  2. 发送明确禁用缓存的标头。
  3. 内容更改时更改文件名。
  4. 将缓存中断数据附加到 url,也就是 img.jpg?t={$file_modification_timestamp}

这是一个全面的选项列表,无论您觉得它们多么不吸引人。

【讨论】:

  • 这篇文章成功了。我稍微修改了标题,它就像一个魅力。谢谢!
【解决方案2】:

当我必须清除缓存时,我偶尔会部署一种低技术的 html-php 方法。在图像标签 src 上抛出一个查询字符串! 如果您通过回显一个随机数来使查询字符串随机化,那么它每次都会破坏该图像的缓存。

    <img src="/images/logo.png?v=<?=rand(1, 10)?>" border="0">

Query Stringed Image

【讨论】:

  • OP 特别希望避免附加随机数,“因为这意味着浏览器会缓存大量图像并让事情看起来很混乱。”您可以考虑解决这些问题。
【解决方案3】:

试试这个:

image.jpg?foo=20180308136060 //year, month, day, hours, minute and seconds

【讨论】:

  • 你没看他们写的吗? “我知道在图像末尾添加“?randomnumber”技巧。但是,我真的不想使用它,因为这意味着浏览器也会缓存大量图像让事情看起来很乱。”
  • @showdev 对;它会加载一次并将相同的保存在内存中。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2012-05-19
相关资源
最近更新 更多