thinkphp用二级域名实现前后端分离的本质是api.example.com与www.example.com彻底解耦:前者仅提供json接口,后者仅托管静态页面,依赖域名识别、路由分流与状态隔离三步协同。

ThinkPHP 用二级域名实现前后端分离,本质不是“把前端代码扔进后端目录”,而是让 api.example.com 和 www.example.com 彻底解耦:前者只管 JSON 接口,后者只托管静态页面。关键在域名识别、路由分流与状态隔离三步协同。
一、域名与应用绑定:让不同子域走不同应用
先确保项目已启用多应用模式(如 app/api/、app/www/ 目录存在),再开启域名部署:
- 在
config/app.php中设'url_domain_deploy' => true - 在
route/app.php中注册域名规则:Route::domain('api', 'api');→ 请求 api.example.com 时加载 app/api/ 应用Route::domain('www', 'www');或Route::domain('*', 'www');→ www.example.com 或根域名走 app/www/(即前端入口) - Nginx/Apache 必须透传
Host头,否则框架无法识别子域名
二、接口与静态资源物理隔离
前后端不再混在同一应用里:
-
api 子域:app/api/ 下只写控制器,返回纯 JSON,禁用模板渲染(不调
fetch(),不输出 HTML) -
www 子域:app/www/ 可简化为仅一个入口控制器(如 index/index),其作用是返回
public/dist/index.html(Vue/React 构建产物),不处理业务逻辑 - 前端构建产物(dist)应由 Web 服务器直接托管,不经过 PHP 路由;后端
public/目录只放静态资源,不放业务代码
三、跨域与认证彻底规避
因域名不同(api.example.com ≠ www.example.com),浏览器默认跨域。但此时无需 CORS——只要接口请求发往 api.example.com,且前端页面来自 www.example.com,就天然满足同源策略的“协议+域名+端口”要求,根本不会触发跨域预检。
- 前端 Axios 请求地址写成
https://api.example.com/v1/login - 后端 api 应用无需配置 think-cors,也不用处理 OPTIONS 预检
- 登录态用 JWT:前端存 token 到 localStorage,每次请求带
Authorization: Bearer xxx,后端用$this->request->header('authorization')解析,不依赖 Cookie 或 Session
四、避免常见陷阱
几个高频出错点:
- 别在 www 应用里写 API 接口,也别在 api 应用里返回 HTML —— 违反职责分离
- 不要用
Route::rule('[:path]', 'index/index')这类通配路由兜底,它会把 api.example.com 的请求也吞掉,导致接口 404 - Session 在二级域名间默认不共享(.example.com 才能共享),但前后端分离场景下本就不该用 Session,改用无状态 JWT
- 验证码必须脱离 Session:生成时返回
captcha_id,校验时从 Redis 查captcha:{id},前后端通过字段传递 ID
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











