thinkphp3.2默认不发送缓存响应头,需手动设置:可在基类控制器_initialize()中统一添加header禁用缓存,或通过view_end钩子注入nocachebehavior行为,亦可针对特定action单独设置;注意避开服务器配置、静态缓存及前端ajax缓存干扰。

ThinkPHP3.2 本身不自动控制浏览器端缓存(即 HTTP Cache),它默认不会发送 Cache-Control、Expires 等响应头来禁用浏览器缓存。若你发现页面被浏览器缓存(比如修改了模板或 JS 却不生效),需手动在控制器或行为中设置响应头。
在控制器中统一禁用浏览器缓存
最直接有效的方式是在基类控制器(如 Controller.class.php)的初始化方法中添加响应头,确保所有继承它的控制器都生效:
- 打开
ThinkPHP/Library/Think/Controller.class.php(或项目中的自定义基类) - 在
_initialize()方法开头插入以下代码:
header('Pragma: no-cache');
header('Expires: 0');
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
针对特定操作或方法临时禁用
若只需某个 Action(如后台数据接口、表单提交页)不被缓存,可在对应方法内单独设置:
- 在控制器方法中调用前加:
$this->header('Pragma', 'no-cache');
$this->header('Expires', '0');
通过输出前钩子全局拦截(推荐用于生产环境微调)
利用 ThinkPHP 的行为机制,在页面输出前统一注入缓存控制头:
- 编辑
Application/Common/Conf/tags.php,添加view_end钩子:
- 新建文件
Application/Common/Behavior/NoCacheBehavior.class.php,内容如下:
namespace CommonBehavior;
use ThinkBehavior;
class NoCacheBehavior extends Behavior {
public function run(&$params) {
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
}
}
注意事项与常见误区
以下情况即使加了 header 也可能失效,需一并检查:
- Apache/Nginx 配置中存在强制缓存规则(如
ExpiresByType或add_header Cache-Control),会覆盖 PHP 设置,需同步调整服务器配置 - 使用了静态缓存(
HTML_CACHE_ON = true)时,生成的 .shtml 文件由 Web 服务器直接返回,PHP 层 header 不起作用,此时应关闭静态缓存或改用动态方式 - 前端 JS 发起的 AJAX 请求若带
cache: true(jQuery 默认),也会触发浏览器缓存,建议显式设为false或添加时间戳参数 - 调试阶段可配合 Chrome DevTools 的 Network → Disable cache 勾选,快速验证是否为浏览器缓存导致问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











