ThinkPHP 必须通过 Web 服务器或 PHP 内置服务器启动,且 public/ 目录必须设为 Web 根目录;localhost:8000 404 是因浏览器对 localhost 特殊处理导致路由失败,而 tp6.test 通过 hosts 解析可正常匹配虚拟主机配置。

ThinkPHP 在 Windows 上不能直接双击运行,必须通过 Web 服务器或 PHP 内置服务器启动,且 public/ 目录必须作为 Web 根目录——这是单入口设计的硬性要求,跳过这步必 404。
为什么 localhost:8000 会 404,而 tp6.test 能行
浏览器对 localhost 有特殊处理:它不走 DNS 解析,也不触发 Apache/Nginx 的虚拟主机匹配逻辑,导致请求无法正确路由到 public/index.php;而自定义域名(如 tp6.test)强制走 hosts 解析,Web 服务器才能按配置把请求交由 ThinkPHP 入口处理。
常见错误现象:
- 地址栏输
tp6.test没反应 → 忘了加http://,浏览器当成搜索词 -
http://tp6.test显示 404 → Web 服务没重启,或虚拟主机DocumentRoot指向了项目根目录而非public/ - 页面打开但静态资源(CSS/JS)404 →
public/没设为根目录,或.htaccess未生效(Apache 需AllowOverride All)
Windows 下最简可行方案:php -S + hosts
不用装 Apache/Nginx,用 PHP 自带开发服务器即可,但必须指定 -t public/ 参数,否则框架无法识别入口。
立即学习“PHP免费学习笔记(深入)”;
操作步骤:
- 确认 PHP 版本 ≥ 7.4(TP6)或 ≥ 8.0(TP8):
php -v - 在项目根目录(含
think文件)执行:php -S localhost:8000 -t public/ - 编辑
C:\Windows\System32\drivers\etc\hosts(管理员权限记事本),追加:127.0.0.1 tp6.test - 刷新 DNS:
ipconfig /flushdns - 浏览器访问
http://tp6.test:8000(注意端口)
注意:php -S 不支持 .htaccess 重写,伪静态 URL(如 /index/hello)默认不可用;如需完整路由测试,仍得配 Apache/Nginx。
在 Windows 上执行终端命令,或对比 Windows 与 Linux 的 Shell 语法时使用。建议先检测当前 Shell 是 PowerShell 还是 cmd.exe,再给出相应命令……
用 phpStudy 等集成环境时,必须改两处
phpStudy、XAMPP 这类工具默认把网站根目录设为项目根目录,而 ThinkPHP 要求是 public/ 子目录——不改就等于把入口文件藏起来了。
关键操作:
- 新建网站时填的“域名”(如
tp6.test)会自动映射到一个空目录,你得把整个 ThinkPHP 项目解压进去,再手动调整根目录 - 在 phpStudy 面板中点该网站右侧“管理 → 修改 → 根目录”,把路径末尾加上
/public(例如原为D:\phpstudy_pro\WWW\tp6,改为D:\phpstudy_pro\WWW\tp6\public) - 同时检查“伪静态”开关是否开启(对应 Apache 的
mod_rewrite或 Nginx 的try_files规则)
漏掉第二步,http://tp6.test 会直接列出目录文件,或报 403 Forbidden。
APP_DEBUG=false 时页面空白,不是代码问题
TP6/TP8 默认关闭调试模式,任何错误(包括 .env 语法错、数据库连不上)都只返回空白页或 500,不报具体信息。
排查顺序:
- 先确保
.env在项目根目录(和think同级),不是放在public/或app/下 - 检查内容是否含非法字符:变量值含
@、!等必须用单引号包裹,如DB_PASSWORD='pass@123!' - 临时在
public/index.php开头加一行:ini_set('display_errors', '1'); error_reporting(E_ALL);,看是否输出 Parse Error - 命令行运行
php think run,观察终端是否有 Fatal Error 输出(比浏览器更早暴露 autoload 问题)
真正难调试的,往往是 .env 读取失败后框架静默 fallback 到默认配置,比如数据库 host 变成 127.0.0.1 而你本地根本没开 MySQL 服务——这种“看起来配置对,实际连不上”的情况,得靠日志或终端错误定位。


















