要实现thinkphp二级域名独立记录操作日志,必须将域名作为强制审计维度:在appinit中间件中用$request->host()稳定提取子域名并注入domain_context;配置按域名分离的日志通道(如admin_audit、api_audit);审计日志payload和数据库表必须显式包含domain字段;同时确保session.cookie_domain设为'.example.com',泛域名和异常日志也需统一处理域名上下文。

要让 ThinkPHP 在二级域名绑定场景下实现「不同域名独立记录操作日志」,核心不是简单开启日志,而是把「域名上下文」作为审计日志的强制维度,隔离存储、统一采集、避免交叉污染。关键在于:域名识别必须早于日志写入,日志驱动必须支持动态路径或前缀,且中间件需在应用层完成上下文注入。
确保域名能被稳定识别并透传
二级域名日志隔离的前提是框架能准确、一致地获取当前请求所属域名。不能依赖 $_SERVER['HTTP_HOST'] 原始值(可能被代理篡改),也不能等到路由匹配后才解析。
- 在全局中间件(如 AppInitMiddleware)中,用
$request->host()获取 Host,并通过strtok($host, '.') === 'admin'或正则提取子域名,存入请求参数:$request->withParam('domain_context', 'admin') - 若使用多应用模式(如 admin.example.com → app/admin/),直接读取
app()->getName()更可靠,它已由 domain_bind.php 或 Route::domain() 触发确定 - Nginx 配置中必须传递原始 Host:
fastcgi_param HTTP_HOST $host;,禁用重写覆盖 Host 的规则
为每个域名配置独立日志通道
ThinkPHP 默认日志是全局共用的,必须显式创建按域名区分的驱动实例,避免 admin 和 api 的操作日志混在同一文件里。
- 在
config/log.php中定义多个通道,例如:'admin_audit' => [... 'path' => runtime_path('audit/admin/') ...],'api_audit' => [... 'path' => runtime_path('audit/api/') ...] - 不推荐硬编码判断域名再切换通道,而应在中间件中动态绑定:
Log::channel('admin_audit')->info(...),通道名可由$request->param('domain_context')拼接生成 - 若用自定义 File 驱动,重写
save()方法时,将$this->config['path']动态设为runtime_path('audit/' . $domain . '/')
审计中间件中注入域名上下文字段
操作日志必须包含可索引的域名标识,否则无法按域名回溯或统计。这不是可选项,而是审计合规的基本要求。
- 在
AuditMiddleware::after()中,从请求中提取domain_context,并写入日志 payload:'domain' => $request->param('domain_context', 'unknown') - 数据库审计表增加
domain VARCHAR(64)字段并建索引,查询「admin 域名下所有删除操作」只需:WHERE domain = 'admin' AND action = 'user_delete' - 禁止仅靠日志文件名区分——如
admin_20260601.log看似隔离,但日志内容无 domain 字段,一旦文件误删或归档混乱,溯源即失效
规避常见安全与一致性风险
二级域名日志分离容易因配置疏漏导致数据泄露、覆盖或丢失,以下三点必须检查。
-
session.cookie_domain 必须设为
'.example.com':否则 admin.example.com 登录后,其操作日志里记录的 user_id 可能为空(因 session 未共享,认证态丢失) -
泛域名(*.example.com)不自动继承日志通道:Route::domain('*', 'index') 匹配 www、test、dev 等,但中间件中若没做兜底处理,这些域名会默认走主日志通道,需显式指定
default_domain_context => 'index' -
异常日志也要带域名上下文:全局异常处理器(
app/exceptionhandle.php)中,同样调用$request->param('domain_context'),确保失败操作也能归属到对应域名域
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











