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

PHP设置Last-Modified头仅首次生效,刷新后消失问题求助

问题分析与解决方案

原因1:浏览器缓存验证机制的显示差异

按F5刷新时,浏览器会发送If-Modified-Since请求头询问资源是否更新。如果你的PHP没处理这个请求,直接返回200状态码,部分浏览器开发者工具可能不会重复显示Last-Modified头(实际响应是有返回的,只是工具显示逻辑问题),或者服务器缓存逻辑跳过了头的设置。

解决办法:
处理If-Modified-Since请求,返回304状态码,同时确保Last-Modified头始终生效:

$editedonDate = "Fri, 08 Sep 2023 11:21:01 GMT";
$modifiedTime = strtotime($editedonDate);

// 处理浏览器的缓存验证请求
if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    $clientModifiedTime = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
    if ($clientModifiedTime >= $modifiedTime) {
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
}

// 始终设置Last-Modified头
header("Last-Modified: $editedonDate");
// 可选:补充缓存控制头,帮助浏览器正确处理缓存
header("Cache-Control: public, max-age=3600"); // 可根据需求调整缓存时长

原因2:服务器缓存模块覆盖PHP设置

如果你的服务器(Apache/Nginx)开了静态缓存或页面缓存模块(比如Apache的mod_expires、Nginx的代理缓存),这些模块可能会覆盖或跳过PHP设置的Last-Modified头,刷新时更容易触发这个问题。

解决办法:

  • Apache环境:在.htaccess里加以下指令,禁用当前页面的自动缓存设置:
<FilesMatch "\.php$">
    Header unset Last-Modified
    FileETag None
</FilesMatch>
  • Nginx环境:在对应location块里配置,禁止自动生成ETag和Last-Modified,让PHP的设置生效:
location ~ \.php$ {
    etag off;
    add_header Last-Modified "" always;
    # 保留你原有的其他配置
}

原因3:PHP输出缓冲或提前输出问题

如果脚本在header()调用前有任何输出(比如空格、换行、HTML标签),会导致头无法正确设置,部分服务器的缓冲配置可能在刷新时放大这个问题。

解决办法:

  • 检查脚本开头,确保header()在所有输出之前。
  • 启用输出缓冲,保证头能正确发送:
ob_start(); // 放在脚本最顶部

$editedonDate = "Fri, 08 Sep 2023 11:21:01 GMT";
header("Last-Modified: $editedonDate");

// 你的其他脚本代码...

ob_end_flush(); // 放在脚本末尾

验证方式

修改后用浏览器开发者工具的「网络」标签检查:

  • 首次加载:确认Last-Modified头存在,状态码200。
  • F5刷新:确认请求头带If-Modified-Since,响应头有Last-Modified,状态码为304(未修改时)或200(修改日期后)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:33:10