Nginx需显式配置将路径转为s参数,如try_files $uri $uri/ /index.php?s=$uri&$args;同时php.ini中cgi.fix_pathinfo必须为1,否则$_GET['s']为空。

在 ThinkPHP 中,s= 参数通常用于隐式 URL 模式(如 index.php?s=home/index/index),它本质是将整个路由路径作为 $_GET['s'] 传入框架进行解析。但在 Nginx 环境下,默认不会自动把 s= 后面的值映射为 $_GET['s'],尤其当使用了重写规则(如去掉 index.php)时,必须显式配置 Nginx 将路径信息提取并转为 s 参数。
关键点:Nginx 不会自动解析 s=,需要你手动用 rewrite 或 try_files 把请求路径(如 /home/index/index)拼成 ?s=/home/index/index 再转发给 PHP。
✅ 正确配置方式(推荐)
在 Nginx 的 server 块中,添加如下 location 规则(适配 ThinkPHP 5/6 的 PATHINFO 模式):
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
或者更规范、不依赖 if 的写法(推荐):
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
⚠️ 注意:
$uri是解码后的路径(如/home/index/index),不是原始请求 URI;$args保留原有查询参数(如?id=123),避免丢失。
✅ PHP 端能收到 $_GET['s'] 的前提
- Nginx 必须把
s=xxx作为查询参数转发(上面配置已做到) - PHP 的
cgi.fix_pathinfo应设为1(默认通常是 1,但某些安全加固环境会改成 0)- 若为
0,PHP 无法正确识别 PATHINFO,会导致$_GET['s']为空 - 检查方法:
php -i | grep 'fix_pathinfo' - 修复:在
php.ini中设cgi.fix_pathinfo = 1,然后重启 PHP-FPM
- 若为
❌ 常见错误配置
- 直接写
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;而没加s参数 →$_GET['s']不会出现 - 用了
rewrite ... break;而非last→ 不会重新匹配 location,导致未进入 PHP 处理流程 - 忘记在
fastcgi_params中保留$args→ 原有 GET 参数丢失,且s=可能被覆盖
✅ 验证是否生效
访问:https://yoursite.com/home/index/index
在控制器中打印:
var_dump($_GET['s']); // 应输出字符串 "/home/index/index"
如果输出 NULL,说明 Nginx 没传过去,重点检查 rewrite 规则和 cgi.fix_pathinfo。
不复杂但容易忽略的是:Nginx 只负责转发,真正让 s= 进 $_GET 的,是它是否以查询参数形式抵达 PHP —— 其余都只是“搬运工”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











