不能直接用。ThinkPHP域名绑定在路由前,页面缓存中间件仅按URL路径匹配、不感知域名,导致多域名共用同一缓存键而内容错乱;需手动将域名注入缓存键、数据查询和配置加载三处。

ThinkPHP 6 的 domain_bind 和页面缓存能一起用吗?
不能直接用。ThinkPHP 的域名绑定(domain_bind)发生在路由解析前,而默认的页面缓存(think\middleware\CacheCheck)是基于 URL 路径匹配的,不感知域名。如果你在 route/domain.php 里绑定了 shop.example.com → shop 模块,但缓存中间件仍按 /index/index 缓存,会导致不同域名下共用同一份 HTML 缓存,内容错乱。
如何让缓存键包含域名?
必须手动干预缓存键生成逻辑。ThinkPHP 页面缓存依赖 CacheKey 类生成键,默认只拼接 REQUEST_METHOD + REQUEST_URI,没包含 HTTP_HOST。你需要重写 think\cache\driver\File::getCacheKey() 或更稳妥地——在中间件中预设缓存键:
- 在
app/middleware.php中注册自定义缓存检查中间件,替换默认的think\middleware\CacheCheck - 在中间件
handle()中,读取$request->host(true)(返回带端口的完整域名),拼进缓存标识:$key = md5($request->host(true) . $request->url(true));
- 调用
Cache::get($key)前,确保该键已由响应内容写入过(即需配合CacheWrite中间件顺序)
为什么不能只改 cache.path 配置?
cache.path 是文件驱动的根目录路径,比如 runtime/cache/,它控制的是物理存储位置,不影响缓存键的语义。即使你把不同域名的缓存存到子目录(如 runtime/cache/shop.example.com/),只要缓存键相同,File::get() 还是会命中错误的内容。关键在「键唯一性」,不在「路径隔离」。
多域名共用一套模板时要注意什么?
如果 shop.example.com 和 blog.example.com 都渲染 index/index 模板,但数据源不同(如店铺商品 vs 博客文章),仅靠域名区分缓存键还不够——你还得确保控制器里没有跨域名共享的静态变量或单例状态。常见坑包括:
立即学习“PHP免费学习笔记(深入)”;
-
Db::name('article')->cache(true)默认用 SQL 本身做键,不包含域名,需显式传参:Db::name('article')->cache('article_list_' . $request->host(), 3600) - 模板中使用
{:config('site_name')},但config()是全局的,不会随域名切换;应改用域名动态加载配置:config(require 'config/' . str_replace('.', '_', $request->host()) . '.php'); - Session 和 Cookie 的
domain设置未适配,导致登录态无法跨子域继承(如需共享,应设为.example.com)



















