在 macOS 上用 MAMP 搭建 ThinkPHP 二级域名本地调试环境,必须严格对齐 hosts 解析、MAMP 虚拟主机和 ThinkPHP 路由三者:①在 /etc/hosts 中添加 127.0.0.1 admin.tp6.test 等映射并执行 sudo dscacheutil -flushcache;②在 httpd-vhosts.conf 中配置 ServerName 与 hosts 一致、DocumentRoot 指向 public/、启用 AllowOverride All;③在 config/app.php 开启 'url_domain_deploy' => true,并在路由文件中用 Route::domain() 绑定子域名与应用目录。

在 macOS 上用 MAMP 搭建 ThinkPHP 二级域名本地调试环境,关键不是堆砌工具,而是让 hosts 解析、MAMP 虚拟主机、ThinkPHP 路由三者严格对齐。缺一不可,错一个就 404 或跳转失败。
hosts 文件必须精准映射
这是整个流程的起点,写错就全盘失效。用管理员权限打开 /etc/hosts(终端执行 sudo nano /etc/hosts),在末尾添加:
127.0.0.1 admin.tp6.test127.0.0.1 api.tp6.test127.0.0.1 tp6.test
注意:IP 和域名之间只用空格或 Tab;域名不能带端口、不能含下划线;每行一个;保存为 UTF-8 无 BOM;改完立即执行 sudo dscacheutil -flushcache 刷新 DNS 缓存。
MAMP 中配置虚拟主机(非默认 htdocs)
MAMP 免费版不直接支持图形化虚拟主机管理,需手动修改 Apache 配置:
立即学习“PHP免费学习笔记(深入)”;
- 打开 /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf,追加如下块(以
admin.tp6.test为例):
<VirtualHost *:80>
ServerName admin.tp6.test
DocumentRoot "/Users/你的用户名/Sites/myapp/public"
<Directory "/Users/你的用户名/Sites/myapp/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
确保:DocumentRoot 指向项目 public 目录(不是根目录);ServerName 必须和 hosts 里完全一致;AllowOverride All 启用 .htaccess(ThinkPHP 伪静态依赖它)。
再确认 /Applications/MAMP/conf/apache/httpd.conf 中已取消注释这两行:
Include conf/extra/httpd-vhosts.confLoadModule rewrite_module modules/mod_rewrite.so
重启 MAMP 的 Apache 服务生效。
ThinkPHP 框架侧启用并绑定子域名
仅配好 Web 服务器还不够,框架必须主动识别并分发请求:
- 在 config/app.php 中开启域名部署:
'url_domain_deploy' => true(TP6 唯一有效开关,APP_SUB_DOMAIN_DEPLOY已废弃); - 在 app/common/route.php 或 route/app.php 中注册路由规则:
Route::domain('admin', 'admin'); // 访问 admin.tp6.test → 加载 app/admin/ 应用
Route::domain('api', 'api'); // 访问 api.tp6.test → 加载 app/api/ 应用
注意:域名前缀(如 admin)必须与 ServerName 中的子域名部分完全一致;应用目录名(如 admin)需真实存在且结构合规。
验证与常见卡点
全部配置完成后,在浏览器访问 http://admin.tp6.test:
- 如果显示 “无法连接”:检查 hosts 是否生效(
ping admin.tp6.test应返回 127.0.0.1)、MAMP Apache 是否监听 80 端口; - 如果显示 404 或白屏:确认 DocumentRoot 是
public/,不是项目根目录;检查 .htaccess 是否被 Apache 正确读取(可临时放一个 phpinfo() 测试); - 如果路由不生效:确认
url_domain_deploy开关已开启,且Route::domain()在正确位置注册(通常在 route/app.php 中)。



















