thinkphp5域名绑定模块不依赖重写规则,但需开启url_domain_deploy配置、正确注册route::domain()规则,并配合nginx/apache重写透传http_host与请求路径,否则将出现404或跳转默认模块。

ThinkPHP5 域名绑定模块本身不依赖重写规则,但必须配合正确的服务器重写配置才能让二级域名访问正常生效;否则会出现 404、跳转到默认模块、或 URL 中残留 index.php 等问题。
开启 url_domain_deploy 并注册域名绑定规则
这是整个功能的开关和路由映射基础。不启用该配置,Route::domain() 完全无效。
- 在
config/app.php(或config.php)中确认已设置:'url_domain_deploy' => true - 在
route/route.php中注册绑定,例如:Route::domain('m', 'mobile');表示访问m.example.com时自动进入mobile模块 - 若使用 com.cn 类域名,需额外配置
'url_domain_root' => 'example.com.cn',否则子域名解析会错位 - 注意:绑定的是「模块名」,不是目录路径;模块必须真实存在于
app/下且命名全小写(如app/mobile/)
Nginx 下必须配对 try_files 而非 if 判断
很多文档仍沿用老旧的 if (!-e $request_filename) { rewrite ... } 写法,这在 Nginx 中易引发重定向循环或 PATH_INFO 解析失败,导致模块绑定后控制器找不到。
- 正确做法是在
server块的location /中使用:try_files $uri $uri/ /index.php?s=$uri&$args; - 该规则确保所有非静态资源请求都透传给
index.php,由 ThinkPHP 自身的路由层识别子域名并分发到对应模块 - 不要在
location ~ \.php块里重复处理 PATH_INFO;ThinkPHP5 默认能从$_SERVER['PATH_INFO']或$_SERVER['QUERY_STRING']中提取s=参数 - 如果用了宝塔或其它面板,伪静态模板选「ThinkPHP 5」而非「6」,因两者参数解析方式不同(TP5 用
s=,TP6 用pathinfo)
Apache 下 .htaccess 必须保留原始请求路径
Apache 的 RewriteRule 若未正确传递路径,会导致 Route::domain() 拿不到完整 Host 信息,从而无法匹配域名规则。
- 确保
.htaccess中有:RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L](注意末尾的PT标志) -
PT(PassThrough)是关键:它让重写后的 URI 进入下一个处理阶段,使 PHP 能通过$_SERVER['REQUEST_URI']和$_SERVER['HTTP_HOST']正确识别当前访问的子域名 - 避免写成
RewriteRule ^(.*)$ index.php?/$1—— 这种 query string 方式会让框架丢失原始路径结构,域名绑定逻辑直接失效 - 确认 Apache 开启了
mod_rewrite,且站点配置中AllowOverride至少包含FileInfo
本地开发时 hosts 和入口文件路径常被忽略
本地调试失败,80% 是因为 DNS 解析或入口文件没走对,跟代码逻辑无关。
- 必须在系统
/etc/hosts(macOS/Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)中添加两行:127.0.0.1 example.com和127.0.0.1 m.example.com - 确认 Web 服务器根目录指向的是
public/,不是项目根目录;否则index.php不在 Web 可访问路径下,域名绑定永远不触发 - 如果用的是百度云 BCH 等限制目录绑定的虚拟主机,需在
/webroot/index.php中手动引入:require './public/index.php';,且重写规则也要相应调整为指向/webroot/index.php - 浏览器访问时,务必清空 DNS 缓存(
sudo dscacheutil -flushcache或ipconfig /flushdns),否则可能还在解析旧 IP
真正容易卡住的地方,是服务器重写规则与框架路由机制的衔接点——不是写对了 Route::domain() 就完事,而是要确保请求完整、无损地抵达 ThinkPHP 的域名解析层;中间任何一层(DNS、Web Server、PHP 入口、框架初始化)断掉,都会表现为“绑定了但没反应”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











