本质是请求未进路由系统:Nginx/Apache拦截返回404或PATH_INFO为空导致框架无法解析路由;解决关键是确保所有非静态请求100%落到public/index.php,再由ThinkPHP内部接管,并确认url_route_on=true、禁用if+rewrite、改用try_files、清除缓存验证。

ThinkPHP 5.0 伪静态和路由冲突,本质不是“两者打架”,而是请求压根没进到路由系统里——Nginx 或 Apache 拦在门外,直接返回 404,或者错误转发导致 PATH_INFO 为空、参数丢失,让 ThinkPHP 拿不到路由路径。解决关键在于:确保所有非静态资源请求,100% 落到 public/index.php,再由框架内部路由接管。
确认路由本身已启用且无硬性拦截
伪静态失效常被误判为路由写错,其实第一步必须排除框架层配置问题:
- 检查 config/app.php 中是否明确开启:
'url_route_on' => true; - 若设了
'url_route_must' => true,则每个访问路径都必须在 route/route.php 中显式定义,否则直接 404 —— 这不是冲突,是强制校验,临时调试可先设为false; - 确保没有在中间件或行为中提前
exit或抛出异常,尤其检查自定义的 URL 解析类是否干扰了$_SERVER['PATH_INFO']或$_SERVER['QUERY_STRING']。
Nginx 下重点防 PATH_INFO 空值引发的 502 或静默失败
TP5.0 默认依赖 PATH_INFO 解析路由(如 /user/list → index.php/user/list),但 Nginx 极易因正则匹配失败导致 为空,进而使 fastcgi_param PATH_INFO 变成空字符串,触发 PHP-FPM 报 “Primary script unknown” 并返回 502。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 禁用老旧的
if (!-e $request_filename)+rewrite组合,尤其避免在宝塔等面板中直接套用未判空的规则; - 改用
try_files方式,彻底绕过 PATH_INFO 提取逻辑:location / { try_files $uri $uri/ /index.php?$query_string; } - 在
location ~ \.php$块中,必须包含:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
注意:用$document_root,不是$realpath_root(除非你明确启用了 realpath 缓存); - 删掉或注释掉
fastcgi_split_path_info相关行 —— TP5 不需要它,留着反而污染PATH_INFO。
Apache 下检查 .htaccess 是否真正生效
很多 404 实际是 .htaccess 根本没跑起来,请求被当作静态路径直接拒掉:
立即学习“PHP免费学习笔记(深入)”;
- 确认
mod_rewrite已启用(Linux 执行a2enmod rewrite,Windows 检查 httpd.conf 中LoadModule rewrite_module是否开启); - 虚拟主机配置中必须有:
AllowOverride All(不能是None或FileInfo单项); - .htaccess 文件必须放在 public 目录下(即 index.php 所在目录),内容推荐用标准版:
RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] - 如果部署在子目录(如
/myapp/),需加RewriteBase /myapp/。
验证与清理动作不能跳过
改完配置不验证,等于没改:
- 执行
nginx -t(Nginx)或apachectl configtest(Apache)确认语法正确; - 重启服务(
nginx -s reload或systemctl restart apache2); - 清空
runtime/cache/和runtime/route/目录,防止旧缓存干扰; - 用
curl -I http://yoursite/index.php/hello/test测试 —— 若能通,说明框架正常;再测curl -I http://yoursite/hello/test,若仍 404,问题 100% 在服务器重写规则; - 打开 Nginx 错误日志(如
/www/wwwlogs/xxx.error.log),搜索not found、Primary script unknown,日志会直指 root 路径错、SCRIPT_FILENAME 拼错或文件不可读。


















