phpStudy用Nginx跑ThinkPHP 5伪静态必须手动修改vhosts.conf/vhosts-ini中location /块为if(!-e $request_filename){rewrite ^(.*)$ /index.php?s=$1 last;},同步设root指向public目录、url_route_on=true、url_html_suffix=''、pathinfo_depr='/',否则因规则错配导致404或白屏。

直接说结论:phpStudy 用 Nginx 跑 ThinkPHP 5,伪静态必须手动改 vhosts.conf 或 vhosts-ini 里的 location / 块,不能点「伪静态」下拉菜单选 ThinkPHP——它塞的是 Laravel 规则,根本不管用。
为什么小皮面板的“ThinkPHP”伪静态选项无效
小皮面板在「网站 → 管理 → 伪静态」里选 ThinkPHP,实际写入的是类似 try_files $uri $uri/ /index.php?$args 的规则。ThinkPHP 5 默认走 PATH_INFO 模式,依赖 index.php?s=/module/controller/action 这种参数格式,而上面那条规则根本不会把路径塞进 s= 参数里。
结果就是:$_SERVER['PATH_INFO'] 为空,路由匹配失败,页面 404 或白屏。
- 错误现象:访问
/index/hello报 404,但/index.php/index/hello能正常显示 - 关键判断:打开 Nginx 错误日志(如
c:\phpstudy_pro\extensions\nginx1.22.1\logs\error.log),搜Primary script unknown—— 多半是root没指对public/目录 - 别被界面误导:下拉菜单只是个摆设,必须手动编辑配置文件
location / 块必须怎么写(Nginx 层)
进入「网站 → 管理 → 配置文件」,找到对应站点的配置,定位到 server 块内的 location / { },**完整替换为以下内容**(注意空格、括号、分号):
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
-
if (!-e $request_filename)是核心:只对真实不存在的文件/目录才重写,避免干扰静态资源 -
s=$1中的s是 ThinkPHP 默认的入口参数名,不能改成q或path - 必须用
last,不是break;break会导致子目录或二级域名下PATH_INFO解析异常 - 确认
root指向项目public/目录,例如:root "D:/www/myapp/public"; - 这个
location /块必须放在location ~ \.php$之前,否则 PHP 处理逻辑会被覆盖
ThinkPHP 5 的 config/app.php 必须配哪三项
Nginx 把请求转过去了,框架自己不认路也不行。打开 config/app.php,确认以下三项:
立即学习“PHP免费学习笔记(深入)”;
-
url_route_on→ 必须设为true,否则整个路由系统不启动 -
url_html_suffix→ 设为''(空字符串),不是'html';否则/user/list会 404,只能访问/user/list.html -
pathinfo_depr→ 必须为'/',和 Nginx 规则中s=$1的路径分割逻辑一致;若设成'-'或'.',$_SERVER['PATH_INFO']就解析错位
这三项缺一不可,改完记得清缓存(runtime/ 目录可删)。
验证顺序和常见坑点
别一改完就狂刷首页,按顺序验证:
- 先测
http://localhost/index.php/index/hello:能出内容,说明 PHP 和框架本身没问题 - 再测
http://localhost/index/hello:404 就查 Nginx 是否重载成功(重启 phpStudy)、root是否指向public、if块括号是否漏了 - 若返回 200 但空白页:开 Nginx 错误日志,重点看
Primary script unknown—— 八成是SCRIPT_FILENAME拼错了,根源常在root设置错误或fastcgi_param SCRIPT_FILENAME写成了$document_root$fastcgi_script_name却没同步改root
最易忽略的其实是 root 指向 public 目录这件事——很多人 root 还停在项目根目录,导致 Nginx 找不到 public/index.php,直接 fallback 到 404 页面。



















