
在 linux 共享主机或本地开发环境中,php 文件修改后浏览器仍加载旧版本,通常是因 web 服务器(如 nginx)启用了响应缓存机制;本文提供可立即生效的 nginx 配置方案,彻底禁用缓存头与条件请求,确保每次请求都执行最新 php 代码。
在 linux 共享主机或本地开发环境中,php 文件修改后浏览器仍加载旧版本,通常是因 web 服务器(如 nginx)启用了响应缓存机制;本文提供可立即生效的 nginx 配置方案,彻底禁用缓存头与条件请求,确保每次请求都执行最新 php 代码。
当您在 PHP 开发中遇到“改了代码却看不到效果”的问题——例如在共享主机、Docker 环境或本地 Nginx + PHP-FPM 配置下,刷新页面始终返回旧逻辑,即使已清除浏览器缓存、更换浏览器(Chrome/Edge 完全无反应,Firefox 偶尔生效),这往往不是浏览器的问题,而是 Web 服务器主动缓存了 PHP 的响应头(如 Last-Modified、ETag)或启用了代理级缓存策略,导致客户端(浏览器)或中间代理复用旧响应,跳过对 PHP 脚本的重新执行。
根本解决思路是:让服务器每次响应都明确声明“不可缓存”,并禁用基于时间或哈希的条件验证机制。以下为适用于 Nginx 的生产就绪型配置片段(需添加至对应 server 块内):
# 强制禁用所有缓存相关响应头 add_header Last-Modified $date_gmt; add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; add_header Pragma "no-cache"; add_header Expires "Mon, 01 Jan 1990 00:00:00 GMT"; # 关闭 Nginx 内置的条件请求处理(避免 304 响应) if_modified_since off; expires off; etag off;
✅ 关键说明:
-
$date_gmt是 Nginx 内置变量,确保Last-Modified始终为当前时间,使If-Modified-Since判断必然失败; -
Cache-Control中no-store是最严格指令,禁止浏览器和任何中间代理存储响应内容; -
if_modified_since off和etag off彻底禁用 Nginx 对静态资源和动态响应的条件协商逻辑,强制每次执行 PHP 脚本(而非返回 304); - 此配置不影响 PHP-FPM 或 OPcache 行为(若需禁用 OPcache,请单独设置
opcache.enable=0在php.ini中)。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 该配置仅适用于开发与调试阶段。生产环境切勿全局启用——它会显著增加服务器负载与带宽消耗;
- 若使用 Apache,请改用
.htaccess中的Header set Cache-Control "no-cache, no-store, must-revalidate"配合FileETag None和Header unset ETag; - 共享主机用户可能无法修改 Nginx 主配置,此时可尝试在 PHP 脚本顶部手动发送缓存控制头(效果有限):
<?php header("Cache-Control: no-cache, no-store, must-revalidate, max-age=0"); header("Pragma: no-cache"); header("Expires: 0"); // 后续业务逻辑... ?> - 修改 Nginx 配置后,务必执行
sudo nginx -t && sudo systemctl reload nginx(或sudo service nginx reload)使配置生效。
总结:PHP 更新不生效的本质,常是服务端缓存策略覆盖了开发预期。通过精准控制 Nginx 的响应头与条件请求行为,可实现“保存即生效”的开发体验。请优先在开发环境部署上述配置,并在上线前恢复合理的缓存策略以保障性能与用户体验。



















