thinkphp5需在route_domain.php配置多域名绑定并用request::ismobile()识别终端;域名键名须为完整小写域名,值为启用的模块名;移动端识别推荐使用ismobile()方法,静态资源应通过static()函数生成以避免路径错乱。

如何在 ThinkPHP5 中配置多域名并自动识别 PC/移动端
ThinkPHP5 本身不内置多域名路由或设备识别逻辑,必须手动配置域名绑定 + 请求头判断。核心是利用 route_domain.php 绑定不同域名到不同模块,再在控制器/中间件中根据 User-Agent 或 HTTP_X_REQUESTED_WITH 区分终端类型。
域名绑定必须写在 route_domain.php 而非 route.php
很多人误把域名规则写进主路由文件,导致完全不生效。TP5 的域名绑定只认 route/app/route_domain.php(或应用级的 route/route_domain.php),且格式严格:
return [
'www.example.com' => 'index',
'm.example.com' => 'mobile',
'api.example.com' => 'api',
];
- 键名必须是完整域名(不含协议、路径),区分大小写
- 值为模块名,该模块需真实存在且启用(
app/multi_module需开启) - 若使用子目录部署,域名绑定仍生效,但需确保 Web 服务器已将所有域名指向同一入口
移动端识别不能只靠 User-Agent 字符串匹配
单纯用 strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') 容易漏判 iOS、部分平板、微信内置浏览器。推荐用 ThinkPHP 自带的 Request::isMobile(),它已封装较全的 UA 规则:
use think\Request;
$request = Request::instance();
if ($request->isMobile()) {
// 走移动端逻辑,比如跳转 mobile 模块模板或返回 JSON
} else {
// PC 端
}
-
isMobile()默认不识别 iPad,如需把 iPad 当 PC 处理,调用时传false:$request->isMobile(false) - 若项目启用了多模块,建议在公共基类控制器的
initialize()中统一判断,并设置模板主题或跳转逻辑,避免每个方法重复写 - 注意:微信内置浏览器 UA 含
MicroMessenger,但多数情况仍应归为移动端,isMobile()已覆盖
静态资源和模板路径容易因域名切换错乱
当 www.example.com 和 m.example.com 共享同一套应用代码时,__STATIC__、__CSS__ 等系统常量仍基于当前请求域名生成,但开发者常手动拼接路径(如 http://www.example.com/static/),导致移动端加载 PC 端资源。
- 一律使用相对路径或 ThinkPHP 的
url()/static()辅助函数生成资源链接 - 模板可按设备动态切换主题目录:
$this->view->engine->setViewPath(APP_PATH . 'mobile' . DS . 'view' . DS);(在 mobile 模块控制器中) - 如果两个域名共用一套模板但样式不同,更稳妥的方式是用 CSS 媒体查询 + 统一入口,而非硬拆模块——尤其当业务逻辑高度重合时
真正麻烦的不是配置多域名,而是移动端识别后如何保持会话一致、登录态共享、缓存策略隔离。这些没法靠路由文件解决,得靠 session 配置的 domain 参数和中间件里的设备上下文注入。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











