根本原因是系统hosts未映射、Web服务器未指向public目录、或框架未启用域名部署——三者缺一不可。需依次完成:①hosts文件添加127.0.0.1 admin.tp6.test等映射并刷新DNS;②Apache/Nginx配置VirtualHost/server块,DocumentRoot/root严格指向public目录且启用重写;③config/app.php中启用'url_domain_deploy'=>true,并通过'domain_bind'绑定完整域名与应用目录。

ThinkPHP本地开发时,浏览器输入http://admin.tp6.test打不开页面,或提示DNS错误、404、No input file specified,根本原因是系统hosts未映射、Web服务器未指向public目录、或框架未启用域名部署——三者缺一不可,单独配对任意两项都无效。
修改系统hosts文件完成域名解析
这是整个流程的起点,写错就全盘失效。
打开系统hosts文件:Windows路径为C:\Windows\System32\drivers\etc\hosts,macOS/Linux路径为/etc/hosts。
用管理员权限(Windows)或sudo(macOS/Linux)编辑该文件,在末尾追加三行:
立即学习“PHP免费学习笔记(深入)”;
127.0.0.1 admin.tp6.test
127.0.0.1 api.tp6.test
127.0.0.1 tp6.test
注意:IP与域名之间只能用空格或Tab分隔;域名不能带端口、不能含下划线;每行一个;保存时编码必须选UTF-8无BOM。
改完立即刷新DNS缓存:【Windows执行ipconfig /flushdns,macOS执行sudo dscacheutil -flushcache】,否则新域名永远不生效。
配置Apache虚拟主机指向public目录
Apache必须知道admin.tp6.test该交给哪个目录处理,且入口必须是public/index.php。
确认httpd.conf中已取消注释这两行:
Include conf/extra/httpd-vhosts.conf
Listen 80
打开conf/extra/httpd-vhosts.conf,在末尾添加:
<VirtualHost *:80>
ServerName admin.tp6.test
DocumentRoot "D:/www/myapp/public"
<Directory "D:/www/myapp/public">
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
关键点:DocumentRoot必须指向public子目录,不是项目根目录;【AllowOverride All不可省略,否则.htaccess失效,伪静态路由全部404】。
为api.tp6.test和tp6.test分别复制粘贴一份,仅修改ServerName和DocumentRoot路径即可。
保存后,必须重启Apache服务(不能只reload),否则配置不加载。
配置Nginx server块并启用try_files规则
Nginx配置更精简,但root路径和PHP处理逻辑容错率更低。
打开你的站点配置文件(如C:/phpEnv/nginx/vhost/admin.tp6.test.conf),写入:
server {
listen 80;
server_name admin.tp6.test;
root D:/www/myapp/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
【root必须写绝对路径,且结尾不加斜杠;SCRIPT_FILENAME必须用$document_root拼接,否则报“No input file specified”】
复制该server块,分别改server_name为api.tp6.test和tp6.test,并同步更新root路径。
保存后,必须通过控制面板点击“重启Nginx”,【不能只执行nginx -s reload,否则旧进程残留导致配置不生效】。
启用ThinkPHP域名部署并绑定应用目录
前三步只是让请求进得来,这一步决定请求进来了走哪条路。
打开config/app.php,找到domain_bind配置项,改为:
'domain_bind' => [
'admin.tp6.test' => 'admin',
'api.tp6.test' => 'api',
'tp6.test' => 'home'
],
注意:键必须是完整域名(含二级域),值必须是对应的应用目录名,且该目录下要有controller/、route/等标准结构。
同时确保url_domain_deploy设为true:
'url_domain_deploy' => true,
这一步不做,即使admin.tp6.test能打开首页,也会因控制器找不到而报500或class not found错误。
若你没建admin/、api/、home/三个应用目录,先在app/同级创建它们,并复制默认的controller/Index.php进去,否则框架启动失败。



















