发布于2026-07-05 阅读(0)
扫一扫,手机访问
在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 路由中硬编码。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8