ThinkPHP在Nginx下无法隐藏index.php的根本原因是服务器配置错误:root未指向public目录、location ~ .php$块中缺失QUERY_STRING传递或未禁用fastcgi_split_path_info、runtime目录权限不足,三者导致路由无法正确转发或解析。
ThinkPHP 在 Nginx 下无法隐藏
,根本不是框架问题,而是 Nginx 没把请求正确转给
——rewrite 规则写错、
干扰、或
指向错误,三者占了 90% 的 404 场景。
为什么加了 rewrite 还是 404?检查 location / 和 location ~ \.
php
$ 是否都配对
只在
里写重写,但
块里没传参,Nginx 找不到匹配的 PHP 文件就直接 404。TP6 默认用
参数接收路由,必须确保这个参数被带进 FastCGI 环境。
块必须包含
或等效的
(宝塔推荐)
块里必须有这行:
(不能只靠
,它不保证含此行)
如果用了
而非
,
可能为空,导致
构造失败——优先用
fastcgi_split_path_info 必须禁用,否则 PATH_INFO 错乱
TP5/6 不依赖 Apache 风格的 PATH_INFO 解析,Nginx 默认开启的
会强行拆分路径,把
拆成
+
,再塞进
,结果框架收不到原始路由,或收到错误值。
在
块中,删掉或注释掉这两行:
和
确认
开头没有硬编码覆盖
(上线环境应删除调试用的
)
如果 PHP-FPM 配置里有
限制,确保
在白名单内
宝塔面板下最稳的配置写法(不用 if 也能跑通)
宝塔新版支持更干净的
写法,比
更安全,且避免因顺序错位失效。关键在于:规则放对位置、
指向明确、参数不遗漏。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
在站点配置的
块内,**删除所有旧的
或
块**,只保留:
(绝对路径,结尾不加斜杠)
runtime 权限不对会导致 debug=false、日志不写、缓存生成失败
很多人改了
的
却没效果,表面是配置问题,实际常因
不可写,导致框架连
都生成不了,最终 fallback 到生产模式。
运行
查 Nginx 主进程用户(如
或
)
确保
上级目录(如项目根目录)对 Nginx 用户可执行(
权限),否则无法 traverse 进入
清空缓存:
或手动删
和
下文件
真正卡住人的从来不是规则本身,而是
指向 public 目录、
关闭、以及
组权限这三点没对齐——少一个,
就藏不住。
index.phppublic/index.phpfastcgi_split_path_inforootlocation /location ~ \.php$s=location /try_files $uri $uri/ /index.php?s=$uri&$args;if + rewritelocation ~ \.php$fastcgi_param QUERY_STRING $query_string;include fastcgi_params;aliasroot$document_rootSCRIPT_FILENAMEroot /path/to/public;fastcgi_split_path_info/user/list/index.php/user/list$_SERVER['PATH_INFO']location ~ \.php$fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_param PATH_INFO $fastcgi_path_info;public/index.php$_SERVER['PATH_INFO']$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];security.limit_extensions.phptry_filesif (!-e ...)rootserverifrewriteroot /www/wwwroot/your-site/public;index index.php;location / { try_files $uri $uri/ /index.php?s=$uri&$args; }location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_pass unix:/tmp/php-cgi.sock; }config/app.php'debug' => trueruntime/route_cache.phpps aux | grep nginxwww-datanginxchgrp www-data runtime && chmod 775 runtime && chmod g+s runtimeruntime/xphp think clearruntime/cache/runtime/route/rootfastcgi_split_path_inforuntimeindex.php