【问题标题】:Browser not caching generated images浏览器不缓存生成的图像
【发布时间】:2023-04-05 05:27:01
【问题描述】:

似乎在某些测试期间,Firefox 不会缓存动态生成(或从缓存服务器端加载)的图像。

我尝试使用标头启用缓存:

$expires = 60*60*24*14;
header("Pragma: public");
header("Cache-Control: maxage=".$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');

但无济于事。我仍然得到“200 OK”而不是“304 Not Modified”。

使用 Stackoverflow 上的搜索寻求答案,我发现有人暗示他们宁愿将浏览器直接重新定位到图像。

喜欢:

header("Location: /img/generated/whatever.png");

我不喜欢这种方法,因为它会导致两个请求。

谁能帮助我,让我知道如何让浏览器缓存这些文件?

请求 URL 未更改,并且不包含任何种子或时间戳。

【问题讨论】:

  • 这是max-age 而不是maxage
  • 感谢您的观察!我改变了它,但不幸的是我仍然得到相同的结果。
  • 至于 304 部分:您是否实现了适当的缓存机制?
  • 请求中有什么内容?我希望有一个“if-not-modified-since”标头。在这种情况下,由服务器/脚本来确定图像自那时以来没有更改并返回 304 Not Modified 而不是返回 200 OK 和图像。
  • @Gumbo 你的意思是什么缓存机制?我必须实施什么?通常情况下浏览器不会自己缓存图像。在任何情况下,我都尝试使用如上所示的标题进行详细说明。对 Eddy:不确定,但图片在 中正常使用,所以我希望浏览器能够发出正确的请求。无论如何,我查看了它并在请求标头中找到了这个:Cache-Control max-age=0 - 这可能是问题吗?

标签: image caching browser


【解决方案1】:

您可以尝试相反的方法。如果您不想重新定位浏览器。您可以使用 .htacess 或/和 mod_rewrite 或其他网络服务器相关模块重写您的 URL。例如以下网址:

http://sub.domain.com/img/gen/<param>/.../<paramN>/image.png 

将被转发(没有客户端重定向)到您的脚本,该脚本在 URL 中具有参数值。这意味着您将只有一个请求。

可以在此处找到执行此类操作的示例:

【讨论】:

  • 感谢您的意见。我不确定这是否是我正在寻找的。基本上我只想告诉浏览器缓存输出。问题是,如果请求 url 和输出在每个请求上都保持完全相同,为什么它不自己做呢?
【解决方案2】:

您在这里缺少的是响应标题中的最后修改标题。前Last-Modified:Wed, 15 Feb 2012 10:07:48 GMT。你可以通过在标题中使用这一行来解决这个问题。

    header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');

你应该有这个的原因是因为浏览器使用last modidfied header来比较文件是否没有被修改,因此不需要重新下载文件。 :

【讨论】:

    猜你喜欢
    • 2014-05-24
    • 2017-09-30
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2018-04-20
    • 2011-11-07
    相关资源
    最近更新 更多