Cache-Control 标头不适用于图像

问题描述 投票:0回答:1

我有一个 php 脚本,可以通过 ID 来分割图像:

function setCacheHeader($seconds = 86400)
{
    $time = gmdate("D, d M Y H:i:s", time() + $seconds) . " GMT";
    header("Expires: $time");
    header("Pragma: cache");
    header("Cache-Control: max-age=$seconds");
}

$file = "/xxx/xxx/" . intval($_GET['id']);

setCacheHeader();
header("Content-Type: image/jpg");
header("Content-Length: " . filesize($file));

以及一个 nginx 配置,用于将 Restful URL 重写到此脚本:

location /images/ {
   rewrite /images/(\d+) /images.php?id=$1 last;
}

缓存头发送正确,

但是浏览器不会缓存内容,我没有看到任何 304 响应,当我访问 /images/ID url 时,它总是返回 200 。我尝试了很多次,没有任何变化。

怎么了?

php caching browser
1个回答
0
投票

您的缓存控制标头似乎工作正常。问题在于过期标头。当浏览器在 2 个标头中获取冲突数据时,它将使用两个 TTL 中较早的一个来确定何时获取新数据。

如果您使用比 86400 秒(正好一天)更不寻常的值测试代码,它会很有用,这可能会给出更明确的指示,表明缓存控制标头是正确的。 有可能有其他东西覆盖了 Expires 标头。如果这是我的问题,我的下一步将是在代码中添加工具来记录它在标题中设置的数据,并将这些数据与您在浏览器中看到的内容进行比较,并在最小的构建环境中测试代码。

顺便说一句,Pragma 标头在这里不执行任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.