ThinkPHP伪静态生效需服务器转发、入口路径、框架参数三者严格对齐;否则首页正常但路由404或URL带index.php。关键配置包括:url_route_on=>true、pathinfo_depr=>’/’、url_html_suffix=>’’,Nginx需root指向public目录,并在location /中用if+rewrite规则转发至/index.php?s=$1,且该块须置于location ~ \.php$之前。

ThinkPHP开启路由后,伪静态配置不是单改Nginx或单调框架就能生效的,必须服务器转发、入口路径、框架参数三者严格对齐。否则常见现象是:首页能打开,但/user/login这类路由直接404,或者URL里始终带着index.php。
确认框架路由已真正启用
仅在配置文件里把url_route_on设为true还不够,还要检查三项:
- url_route_on => true:这是路由开关,必须开启
- pathinfo_depr => '/':ThinkPHP默认用斜杠分隔PATH_INFO,若改成'-'或'.',Nginx传过来的s参数就无法被正确解析
- url_html_suffix => ''(空字符串):要支持/user/login这种无后缀URL,不能留默认值或设成'.html';如果想用.html后缀,需同步在Nginx规则中保留$query_string,并确保路由定义匹配
Nginx主规则选对写法
推荐使用if + rewrite方式,兼容性好,尤其适合宝塔、小皮等面板环境:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在站点配置的
server块内,找到或新建location / { }块 - 完整替换为以下内容(注意空格、括号、分号):
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
- 确保该
location /块在location ~ \.php$之前 - root必须指向项目public/目录,例如:
root "/www/wwwroot/myapp/public";
验证关键细节是否到位
很多问题其实卡在细微处:
立即学习“PHP免费学习笔记(深入)”;
- 访问
https://yoursite.com/index.php/user/login能正常打开,说明框架本身没问题;再试https://yoursite.com/user/login——如果404,就是Nginx没把请求转给index.php - 检查Nginx错误日志(如
/www/wwwlogs/yoursite.error.log),看是否有“No input file specified”或“rewrite or internal redirection cycle”提示 - 确认public目录下存在
index.php,且权限可读可执行;不要把整个ThinkPHP项目根目录设为网站根目录 - TP6/8项目还需检查
.env中APP_ENV=production,开发环境下某些路由行为可能被绕过
子目录部署要额外处理
如果项目放在https://example.com/myapp/下,原始规则会失效:
- 不能直接套用
rewrite ^(.*)$ /index.php?s=$1,因为$1会丢失/myapp/前缀 - 应改为带路径前缀的写法:
location /myapp/ {
if (!-e $request_filename) {
rewrite ^/myapp/(.*)$ /myapp/index.php?s=$1 last;
}
}
- 同时确保
root指令写在server块顶层,而不是这个location里


















