Cache-Control响应头对图片不生效,求助排查问题原因
问题分析与解决
你的问题核心在于PHP脚本没有处理浏览器的缓存验证请求头,导致无法返回304 Not Modified响应,浏览器因此每次都重新加载完整资源,不会使用本地缓存。
具体问题点
- 缺少缓存验证逻辑:当浏览器缓存资源后,再次请求会发送
If-Modified-Since请求头(对应资源的Last-Modified时间),但你的脚本完全没有处理这个头,每次都直接返回200和完整内容,浏览器自然不会触发缓存复用。 - 未发送
Last-Modified响应头:浏览器需要这个头来记录资源的修改时间,下次请求时才能发送验证请求头。 - 漏写文件输出逻辑:原脚本只发送了响应头,但没有输出图片文件的内容,会导致浏览器拿到空响应,这也是潜在问题。
修复后的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
相关产品推荐
相关产品推荐

