ThinkPHP 5.1 伪静态核心依赖 s= 参数而非 PATHINFO 模式;Nginx/Apache 重写规则需将 URL 转为 /index.php?s=xxx 格式,框架优先读取 $_GET['s'] 解析路由,PATHINFO 仅为可选且易出错的辅助方式。

ThinkPHP 5.1 伪静态主要靠 s= 参数,不是 PATHINFO 模式。
s= 参数是 TP5.1 路由解析的核心机制
TP5.1 默认使用兼容模式(url_model => 3)或 PATHINFO 模式(url_model => 1),但无论哪种,只要开启路由(url_route_on => true),框架内部实际依赖的是 $_GET['s'] 来提取和解析路由路径。Nginx 或 Apache 的重写规则,本质就是把原始 URL 转换成带 s= 的查询参数,再交由 index.php 处理。
- 例如访问
/article/123.html,Nginx 规则rewrite ^/(.*)\.html$ /index.php?s=/$1 last;会把它变成/index.php?s=/article/123 - 框架读取
$_GET['s']后,再按pathinfo_depr(默认为/)拆解成控制器、操作、参数 - 即使启用 PATHINFO 模式,TP5.1 也不直接依赖
$_SERVER['PATH_INFO'];它仍会尝试从s参数 fallback 解析
PATHINFO 模式在 TP5.1 中只是辅助,且易出问题
TP5.1 支持 url_model => 1(PATHINFO 模式),理论上可走 $_SERVER['PATH_INFO'],但实际部署中存在明显限制:
- 需要 Web 服务器正确设置并透传 PATH_INFO(如 Nginx 需
fastcgi_split_path_info,Apache 需[PT]标志) - 宝塔等主流面板默认配置不兼容该模式,容易报错 “URL pathinfo not supported”
- 一旦 PATH_INFO 不可用,框架会自动降级回读
s参数——说明s才是兜底和主通道
为什么不能只靠 PATHINFO?
因为 TP5.1 的路由初始化逻辑中,think\App::run() 会优先检查 $_GET['s'] 是否存在;若存在,就直接用它做路由匹配,跳过 PATH_INFO 解析流程。这意味着:
立即学习“PHP免费学习笔记(深入)”;
- 所有标准伪静态配置(包括宝塔内置的 TP 规则)都围绕
s=构建 - 删掉
s=或重写目标漏传$1,哪怕 URL 看起来“很静态”,也会 404 -
url_html_suffix、路由定义、URL 生成函数(如url())全部基于s参数路径工作
小结:s= 是事实标准,PATHINFO 是可选但非推荐路径
对绝大多数 TP5.1 项目来说,伪静态 = 正确转发 URL 到 /index.php?s=xxx + 框架开启路由 + 匹配分隔符一致。不要试图绕开 s 参数去强推 PATHINFO,否则调试成本高、兼容性差、上线易翻车。



















