怎样在ThinkPHP中实现前后端路由域名隔离【路由】
在ThinkPHP中实现前后端路由域名隔离可通过域名绑定路由分组或多应用模式实现。前者在route.php中按域名加载不同路由,适合中小项目;后者创建独立应用,根据域名自动切换入口,适合复杂项目。需处理跨域与Cookie适配,统一domain或采用Token鉴权,Web服务器确保子域名指向同一public目录。
在ThinkPHP中实现前后端路由的域名隔离,说白了就是让前端访问(比如 www.example.com)和后端管理访问(比如 admin.example.com)走完全不同的路由逻辑,彼此不干扰。实现方式主要有两种:一种是相对轻量的“路由分组 + 域名绑定”,另一种是适合复杂项目的“多应用模式”。

先说说最常用、也最省事的方案——域名绑定路由分组。这种方式不需要把项目拆成多个应用,特别适合中小型项目。具体操作是在 route/route.php 里,按域名分别定义路由分组:
- 前端域名(比如
www.example.com)只加载前台路由,控制器放在app/index/controller目录下。 - 后台域名(比如
admin.example.com)绑定独立分组,控制器建议放在app/admin/controller目录下。 - 每个分组内可以设置统一的路由前缀(比如
/api或/manage),当然也可以直接响应根路径。
来看一段示例代码:
use thinkfacadeRoute;
// 前台域名
Route::domain('www.example.com', function () {
Route::get('/', 'index/index');
Route::get('article/:id', 'index/article');
});
// 后台域名
Route::domain('admin.example.com', function () {
Route::get('/', 'admin/index');
Route::get('user/list', 'admin/user/list');
Route::post('user/add', 'admin/user/add');
});
如果前后端逻辑差异比较大,比如权限体系、业务逻辑完全分离,那么多应用模式(ThinkPHP 6+ 原生支持)是更好的选择。具体来说:
- 创建两个应用:
app/index(前台)和app/admin(后台)。 - 每个应用拥有独立的
route.php、中间件和配置文件。 - 通过域名自动切换应用入口:在
public/index.php中根据$_SERVER['HTTP_HOST']设置默认应用名。
入口文件里的判断逻辑大致是这样的:
$host = $_SERVER['HTTP_HOST'];
if (str_starts_with($host, 'admin.')) {
define('APP_NAME', 'admin');
} else {
define('APP_NAME', 'index');
}
域名隔离之后,一个绕不开的问题是跨域和 Cookie 的适配。前端页面在 www.example.com 上,调用 admin.example.com/api 接口时,跨域问题必须处理。简单的做法是在中间件中统一设置 Access-Control-Allow-Origin。至于登录态共享,需要统一 Cookie 的 domain,比如设为 .example.com,否则 www 和 admin 无法共用 session。一个更现代的建议是:后台 API 统一返回 JSON,并启用 Token 鉴权,这样可以大大减少对 Cookie 的依赖。
最后,Web 服务器这边的配置也不能忽视。确保所有子域名都指向同一个 public/ 目录,Web 服务器不需要做特殊转发。静态资源(CSS、JS、图片)可以统一放在 public/static/ 下,或者走 CDN 分发。至于强制 HTTPS 或域名跳转,这些应该在 Web 服务器层配置,而不是在 PHP 路由中硬编码。


































