ThinkPHP在Nginx下GET参数丢失的根本原因是伪静态规则未显式保留$query_string,导致$_GET为空;正确做法是用try_files $uri $uri/ /index.php?$query_string或rewrite中拼接$1?$query_string,并确保fastcgi_param QUERY_STRING $query_string已配置。

ThinkPHP在Nginx下GET参数丢失,根本原因是伪静态规则重写时覆盖或清空了原始查询字符串($query_string),导致$_GET为空。这不是框架问题,而是Nginx转发逻辑不完整造成的。
确保重写规则保留$query_string
常见错误写法:rewrite ^(.*)$ /index.php?s=$1 last;——它只传了路径部分($1),把问号后的?a=1&b=2全丢了。
正确做法是显式拼接$query_string:
- 用
try_files方式(推荐):location / { try_files $uri $uri/ /index.php?$query_string; } - 用
if+rewrite方式(需谨慎):if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1&$query_string last; }(注意&是HTML实体,配置中写&)
检查PHP处理块是否透传QUERY_STRING
即使入口URL带上了?s=/user&id=5,若location ~ \.php$块里没把$query_string传给PHP,依然收不到。
立即学习“PHP免费学习笔记(深入)”;
确认该区块内有这行:fastcgi_param QUERY_STRING $query_string;
如果没有,手动添加;同时确保已有:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
ThinkPHP 6/8 路由模式影响取参方式
TP6+默认走s=参数解析路由,但$_GET仍应可用。如果input('a')或param('a')拿不到值,先验证原生PHP是否收到:
- 在
public/index.php开头加:var_dump($_GET, $_SERVER['QUERY_STRING']); die; - 访问
/user?id=123,看输出里是否有id——没有就说明Nginx没传过去;有但框架拿不到,再查路由定义或param()调用位置
避免PATH_INFO干扰导致的参数混淆
部分旧配置启用PATH_INFO并依赖它解析路由,但Nginx未正确分割时,会把整个URL路径塞进$_SERVER['PATH_INFO'],反而挤占$_GET空间。
更稳妥的做法是:关闭PATH_INFO依赖,统一用s=参数传路由 + 显式GET参数:
- 在
config/app.php中设:'url_route_on' => true,(保持开启) - 但不要设
'url_common_param' => false以外的复杂路由模式 - 确保
php.ini中cgi.fix_pathinfo=0,防止Nginx错误解析



















