ThinkPHP路由生效必须同时满足服务器正确转发、框架显式启用路由、URL解析模式与重写规则严格匹配;漏任一环即404或“No input file specified”。

ThinkPHP 的路由配置和多语言 URL 重写不是靠“开个开关”就能自动生效的,它必须同时满足三件事:Web 服务器能正确转发请求、框架路由被显式启用、URL 解析模式与重写规则严格匹配。漏掉任何一环,都会出现 404 或 No input file specified。
Apache 下 .htaccess 规则写错导致路由不触发
很多人把 ThinkPHP 官方给的 .htaccess 复制进去就以为完事了,但 TP5.1+ 和 TP6 的 PATH_INFO 解析方式已不同,旧规则会直接让路由失效。
-
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]是 TP5.0 的写法,TP5.1 起必须改用RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1],否则$_SERVER['PATH_INFO']为空,路由找不到控制器 - 如果项目部署在子目录(如
/myapp/),RewriteBase必须显式声明:RewriteBase /myapp/,否则重写后路径错位,index.php找不到或加载错误模块 - Windows 下新建
.htaccess文件容易带扩展名(如.htaccess.txt),必须用命令行重命名:ren htaccess.txt .htaccess
ThinkPHP 路由未开启或配置位置不对
路由是独立开关,不依赖 URL 重写,也不受 url_domain_deploy 或 url_html_suffix 控制。关着它,哪怕服务器重写成功,也只会走到默认控制器,不会按你写的规则分发。
- TP6 中必须在
config/app.php里设'route_enable' => true;TP5.x 则是'URL_ROUTER_ON' => true - 路由定义文件位置有差异:TP6 是
route/app.php,TP5.x 是route/route.php,放错文件根本不会加载 - 静态路由优先级高于动态路由,但如果你写了
'user/:id' => 'index/user/read',又在前面加了'user' => 'index/user/index',访问/user就永远进不去:id分支
Nginx 配置中 $query_string 丢失导致 GET 参数为空
Nginx 没有 .htaccess,所有转发逻辑必须写死在 server 块里。漏掉查询参数传递,$_GET 就是空数组,表单提交、分页、搜索全崩。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法是:
try_files $uri $uri/ /index.php?$query_string;—— 注意末尾的$query_string,不是$args(虽然等价),更不能写成/index.php?S=(TP5 旧写法,TP6 已废弃) - 如果用了
fastcgi_split_path_info,要确认SCRIPT_FILENAME指向的是真实index.php路径,否则报File not found - CDN 或反向代理环境下,
HTTP_HOST可能被覆盖,需在 Nginx 中加proxy_set_header Host $host;,否则域名绑定路由(如Route::domain('api.example.com', ...))会匹配失败
多语言 URL 重写时语言标识位置混乱
多语言不是靠路由自动识别的,得自己设计 URL 结构并配合中间件或前置路由解析。常见错误是把语言段塞进模块名,结果和系统路由冲突。
- 推荐结构是
/zh-CN/article/123或/article/123?lang=zh-CN,前者需在入口前统一截取语言段,存入think\facade\App::langSet() - 不要写
'zh-CN/:controller/:action' => ':controller/:action'这类路由——它无法泛匹配,且和默认路由规则打架;应该用前置闭包路由:Route::rule('[:lang]/[:controller]/[:action]', 'index')->pattern(['lang' => '[a-z]{2}-[A-Z]{2}']); - 语言切换链接必须用
url()函数生成,手动拼 URL 很容易漏掉当前语言上下文,比如从/en-US/跳到/zh-CN/时没重置参数,导致 URL 变成/zh-CN/xxx?id=1&lang=en-US
最常被忽略的是:本地用 php -S 启动时,.htaccess 和 Nginx 配置完全无效,必须另写 router.php 拦截所有请求并手动转发到 index.php,否则连最基础的路由都测不了。


















