ThinkPHP如何实现API接口绑定独立域名 ThinkPHP API域名路由策略-1

ThinkPHP 6 路由绑定域名必须用 domain 而不是 bind

很多人在配置 API 独立域名时,误以为和模块绑定一样用 bind,结果路由完全不生效。ThinkPHP 6 的域名绑定是路由层能力,必须通过 domain 方法声明,且只对定义在该域名下的路由生效。

常见错误现象:http://api.example.com/v1/user 返回 404,但 http://www.example.com/api/v1/user 却能访问——说明没走域名路由,而是走了默认入口或路径匹配。

app/route.php 中必须用 Route::domain(‘api.example.com’, function () { … }) 包裹 API 路由不能在 config/app.php 或 config/route.php 里写 ‘bind’ => [‘api’ => ‘api’],这仅用于子域名前缀识别,不等于域名路由如果用泛域名(如 *.example.com),需确保 Web 服务器已通配解析,且 ThinkPHP 不自动处理通配,要显式写 Route::domain(‘{name}.example.com’, …) 并加参数捕获

Apache/Nginx 必须把所有域名请求都指向同一入口文件

ThinkPHP 不像 Node.js 那样能监听多个 host,它依赖 Web 服务器把 api.example.com 和 www.example.com 的请求都转发到 public/index.php,再由框架内部根据 $_SERVER[‘HTTP_HOST’] 匹配 domain 路由。

典型翻车点:Nginx 配了两个 server 块,却分别指定了不同 root,导致 API 域名根本没进 TP 入口,直接 404 或返回静态文件。

立即学习“PHP免费学习笔记(深入)”;

Nginx 示例中,server_name api.example.com; 的块里,root 必须和主站一致,比如都指向 /var/www/project/publicApache 要确认 VirtualHost 的 DocumentRoot 指向同一 public 目录,且启用 mod_rewrite本地开发用 php -S 启动时无法绑定多域名,必须换 Nginx/Apache 或用 DnsProxy 类工具临时映射

Route::domain() 内部不能再嵌套 Route::group() 的 domain 绑定

ThinkPHP 的域名路由是扁平结构,domain 回调函数内写的任何路由,都会自动带上该域名上下文;但如果你在里面又调用一次 Route::domain(‘xxx’),会导致第二层域名被忽略,甚至报错 Domain route not support nested(TP 6.1+)。

实际场景:想让 admin.api.example.com 和 api.example.com 共享一套 API 路由逻辑,但分不同权限控制——这时不能靠嵌套 domain,而应统一收口、用中间件区分。

正确做法:用 Route::domain([‘api.example.com’, ‘admin.api.example.com’], function () { … }) 数组传多个域名若需差异化行为(如 admin 子域走 JWT,普通 api 走 token),应在路由回调里注册中间件,而不是拆成两个 domain 块Route::domain() 不支持通配符匹配(如 *.api.example.com),只能精确或数组枚举

跨域、HTTPS 和 Cookie 的隐性影响

独立域名意味着浏览器视为不同源,withCredentials: true 的 AJAX 请求会失败,Session 默认无法共享,HTTPS 证书也得单独配——这些都不是 ThinkPHP 能解决的,但容易误判为路由问题。

比如前端调用 https://api.example.com/login 成功后,后续请求拿不到 Cookie,导致鉴权失败,开发者却反复检查 Route::domain 写法。

前后端同域最省事;若必须跨域,后端需明确设置 Access-Control-Allow-Origin 为具体域名(不能用 * 配 withCredentials)Session 共享需手动配置 session.domain 为 .example.com(注意开头的点),且所有子域共用同一 session_idHTTPS 下,Cookie Secure 属性必须开启,否则浏览器拒绝发送 Cookie;TP 的 cookie.secure 配置项要设为 true事情说清了就结束。域名路由本身不复杂,但卡点全在 Web 服务器配置和跨域连带效应上,别一上来就改框架代码。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。