我有一个 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 。我尝试了很多次,没有任何变化。
怎么了?
您的缓存控制标头似乎工作正常。问题在于过期标头。当浏览器在 2 个标头中获取冲突数据时,它将使用两个 TTL 中较早的一个来确定何时获取新数据。
如果您使用比 86400 秒(正好一天)更不寻常的值测试代码,它会很有用,这可能会给出更明确的指示,表明缓存控制标头是正确的。 有可能有其他东西覆盖了 Expires 标头。如果这是我的问题,我的下一步将是在代码中添加工具来记录它在标题中设置的数据,并将这些数据与您在浏览器中看到的内容进行比较,并在最小的构建环境中测试代码。
顺便说一句,Pragma 标头在这里不执行任何操作。