You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cache-Control响应头对图片不生效,求助排查问题原因

问题分析与解决

你的问题核心在于PHP脚本没有处理浏览器的缓存验证请求头,导致无法返回304 Not Modified响应,浏览器因此每次都重新加载完整资源,不会使用本地缓存。

具体问题点

  1. 缺少缓存验证逻辑:当浏览器缓存资源后,再次请求会发送If-Modified-Since请求头(对应资源的Last-Modified时间),但你的脚本完全没有处理这个头,每次都直接返回200和完整内容,浏览器自然不会触发缓存复用。
  2. 未发送Last-Modified响应头:浏览器需要这个头来记录资源的修改时间,下次请求时才能发送验证请求头。
  3. 漏写文件输出逻辑:原脚本只发送了响应头,但没有输出图片文件的内容,会导致浏览器拿到空响应,这也是潜在问题。

修复后的PHP脚本

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']);

// 检查文件是否存在
if (!file_exists($file)) {
    header("HTTP/1.1 404 Not Found");
    exit;
}

$fileMtime = filemtime($file);
$lastModified = gmdate("D, d M Y H:i:s", $fileMtime) . " GMT";

// 处理If-Modified-Since请求头,返回304
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && $_SERVER['HTTP_IF_MODIFIED_SINCE'] === $lastModified) {
    header("HTTP/1.1 304 Not Modified");
    exit;
}

// 发送缓存头和文件相关头
setCacheHeader();
header("Content-Type: image/jpg");
header("Last-Modified: $lastModified");
header("Content-Length: " . filesize($file));

// 输出图片文件内容
readfile($file);

Nginx配置额外验证

确保rewrite规则正确匹配,可查看Nginx的access.log确认请求是否正确重写到images.php;如果Nginx有额外的缓存或头设置,避免覆盖PHP发送的缓存头。

内容的提问来源于stack exchange,提问作者daisy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:52:19