ThinkPHP实现admin子域名独立数据看板,核心是路由隔离、数据库/模型权限分离、域名绑定三者协同:需在route.php中用Route::domain('admin.example.com')绑定模块,配置独立数据库连接或表前缀,设置admin专属session/cache前缀,并确保Nginx/Apache正确传递HTTP_HOST。

ThinkPHP 实现 admin 子域名独立数据看板,核心在于路由隔离 + 数据库/模型权限分离 + 域名绑定,不是简单改个 config 就能跑通。重点是让 admin.example.com 访问的控制器、模型、缓存、统计逻辑与主站 www.example.com 完全解耦,避免数据混用或权限越界。
一、配置多域名路由(关键:绑定子域名到模块)
在 route/route.php 中启用子域名路由规则,将 admin.example.com 统一映射到 admin 模块:
use think\facade\Route;
<p>// 启用子域名部署
Route::domain('admin.example.com', function () {
// 所有请求走 admin 模块(需提前创建 app/admin 目录及控制器)
Route::rule(':any', 'admin/:controller/:action', ['method' => 'GET|POST']);
});</p><p>// 主站保持默认(可选)
Route::domain('www.example.com', function () {
Route::rule(':any', 'index/:controller/:action');
});
⚠️ 注意:
- 确保 Nginx/Apache 已泛解析或显式配置 admin.example.com 指向同一项目根目录;
- 若用 Apache,需开启 mod_vhost_alias 并确认 ServerAlias 包含子域名;
- ThinkPHP 需开启 'url_domain_deploy' => true(config/app.php)。
二、隔离 admin 模块的数据访问层
不能复用主站的 Model 或 Db 类直接查业务表——否则统计口径易冲突。推荐两种方式:
-
独立数据库连接:在
config/database.php中新增admin连接,admin 模块内所有模型指定该连接:
// app/admin/model/StatVisit.php
namespace app\admin\model;
use think\Model;
<p>class StatVisit extends Model
{
protected $connection = 'admin'; // 使用独立数据库配置
}
-
统一前缀 + 权限控制:若共用库,给 admin 表加
adm_前缀(如adm_visit_log),并在模型中重写table:
protected $table = 'adm_visit_log';
同时在 admin 控制器中禁用主站用户模型,强制使用 app\admin\model\AdminUser 登录鉴权。
立即学习“PHP免费学习笔记(深入)”;
三、数据看板统计逻辑不共享缓存和会话
admin 子域名必须使用独立 Session 和 Cache,防止主站用户登录态污染后台统计:
- 在
config/session.php中按域名区分:
'prefix' => $_SERVER['HTTP_HOST'] === 'admin.example.com' ? 'admin_' : 'web_', 'cookie_prefix' => $_SERVER['HTTP_HOST'] === 'admin.example.com' ? 'admin_' : 'web_',
- Cache 配置同理,在
config/cache.php中动态设置prefix,或直接为 admin 模块单独定义缓存实例(用Cache::store('admin_redis')); - 所有统计类(如 PV/UV 计算)封装进
app/admin/service/StatService.php,禁止调用app\common\service\*下的通用统计逻辑。
四、部署与调试要点
上线前务必验证三项:
- DNS 和 Web 服务器已正确解析
admin.example.com,且 PHP 能通过$_SERVER['HTTP_HOST']获取到完整子域名; - 访问
admin.example.com/index/index应触发app/admin/controller/Index.php,而非主站控制器; - 执行一条 admin 模块内的统计 SQL(如
SELECT COUNT(*) FROM adm_visit_log),确认无权限错误、无表不存在报错。
调试时可在入口文件 public/index.php 顶部临时打印 var_dump($_SERVER['HTTP_HOST']);,确保子域名识别无误。
不复杂但容易忽略的是域名路由和数据库连接的显式绑定——ThinkPHP 默认不会自动区分子域名下的模型行为,必须手动切离。



















