ThinkPHP 5.1 静态缓存可按需豁免,推荐三种方式:1. 路由中调用 cache(false) 禁用;2. 全局配置 request_cache_except 正则排除URL;3. 模板中通过 $no_html_cache 标识控制。

ThinkPHP 5.1 的静态缓存(HTML 缓存)默认作用于所有 GET 请求的控制器操作,但实际项目中常需跳过登录页、后台管理页、用户中心等动态性强或含敏感数据的页面。排除方式不是“全局关掉”,而是按需精准豁免,主要有三种可靠方法。
直接在控制器操作方法中关闭静态缓存
适用于单个方法(如 login、logout、profile),最直接有效:
- 在对应方法顶部添加
halt()前或逻辑开始处,调用response()->header('X-No-Cache', '1')并返回空响应不生效;正确做法是: - 使用
config('html_cache_on', false)仅对当前请求临时关闭,但更推荐使用框架内置标记:
public function login()
{
// 关键:禁用当前操作的 HTML 静态缓存
\think\Cache::tag('html_cache')->rm($this->request->url(true));
// 或更标准的做法——在方法开头设置不缓存标识
$this->assign('no_html_cache', true);
return $this->fetch();
}然后在模板渲染前(如 view_base.php 或公共 layout 中)加判断:
{if !isset($no_html_cache) || !$no_html_cache}
<!-- 正常走静态缓存 -->
{else}
<!-- 强制不生成静态缓存文件 -->
{/if}不过 TP5.1 更推荐下面两种配置级方式。
立即学习“PHP免费学习笔记(深入)”;
在路由定义中显式禁用请求缓存
静态缓存底层依赖「请求缓存」机制(request_cache),而该机制支持路由粒度控制:
- 打开
route/route.php,对不需要缓存的路由,显式调用cache(false)或省略cache():
// 不缓存登录页
Route::get('login', 'Index/login')->cache(false);
// 不缓存用户提交动作(即使为 GET,也建议禁用)
Route::get('user/profile', 'User/profile')->cache(false);
// 后台入口一律不缓存
Route::group('admin', function () {
Route::get('index', 'Admin/index');
Route::get('setting', 'Admin/setting');
})->cache(false); // 整组路由禁用⚠️ 注意:
cache(false)会同时禁用「请求缓存」和「HTML 静态缓存」,因为后者是前者的输出落地形式。
全局配置中按 URL 规则排除
在 config/app.php 中启用 request_cache_except 配置项(TP5.1 原生支持):
'request_cache_except' => [
'^/login$',
'^/logout$',
'^/admin/.*',
'^/user/.*',
'^/api/.*',
],- 这是正则数组,匹配请求路径(不含域名和 query string)
- 匹配成功即跳过整个请求缓存流程,自然也不会生成
.html静态文件 - 无需改代码、不侵入业务逻辑,适合统一管控
补充:确认静态缓存是否真正被跳过
部署后验证是否生效,可检查:
-
runtime/html/目录下是否没有生成对应路径的.html文件(如runtime/html/login.html) - 访问页面时响应头是否包含
X-Runtime-Cache: Miss或无X-Runtime-Cache字段 - 查看日志(开启
app_trace)中是否有HTML cache skipped for /login类提示(需自行加日志点)
不复杂但容易忽略。



















