ThinkPHP在Nginx下中文路由报错本质是URL解码与PATH_INFO传递链断裂:Nginx未正确解码URI或PHP-FPM未透传原始路径;须禁用if+rewrite、改用try_files $uri $uri/ /index.php?$query_string;,并确保fastcgi_param REQUEST_URI $request_uri;、PATH_INFO $fastcgi_path_info;及fastcgi_split_path_info正则准确配置。

ThinkPHP在Nginx下处理中文路由报错(如乱码、404、PATH_INFO截断或空值),本质是URL解码与PATH_INFO传递链断裂:Nginx未对URI做正确解码,或PHP-FPM未将原始路径信息完整透传给框架。关键不在ThinkPHP本身,而在Nginx配置与fastcgi参数协同是否到位。
确保Nginx正确接收并保留原始URI
Nginx默认会对请求URI进行一次解码,若客户端发送的是UTF-8编码的中文路径(如/文章/详情),而Nginx在匹配location或重写时又做了一次错误解码,会导致PATH_INFO内容损坏。
- 检查Nginx配置中是否含
underscores_in_headers on;(非必需,但避免header干扰) - 禁用可能触发二次解码的指令,例如不要在rewrite中使用
encode或decode修饰符 - 确认所有
location块未用正则强制截断或替换中文字符(如rewrite ^/([a-zA-Z0-9]+)/.*$ ...会直接丢弃中文)
用try_files替代if+rewrite,避免PATH_INFO丢失
旧式if (!-e $request_filename) { rewrite ... }在含中文路径时极易导致$_SERVER['PATH_INFO']为空或乱码,尤其在Windows或PHP 8+环境下。必须改用try_files方案:
- 在
location /中写入:try_files $uri $uri/ /index.php?$query_string; - 该方式不依赖
if判断,不触发Nginx内部URI重写逻辑,原始$request_uri被完整保留在$query_string中供框架解析 - ThinkPHP 6/8 默认支持
QUERY_STRING模式路由,只要url_route_on = true且未强制设为pathinfo模式即可正常识别s=/文章/详情类参数
补全fastcgi_param,让中文路径进得来、分得清
即使重写成功,若PHP层收不到干净的路径信息,框架仍无法路由。需确保PHP处理块(location ~ \.php$)内包含以下三行:
立即学习“PHP免费学习笔记(深入)”;
-
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;(必须用$realpath_root,防符号链接和路径拼接错误) -
fastcgi_param PATH_INFO $fastcgi_path_info;(用于pathinfo模式;若用?$query_string,此项可选但建议保留) -
fastcgi_param REQUEST_URI $request_uri;(ThinkPHP内部会用它还原原始中文路径,尤其在子目录部署时更关键)
同时确认fastcgi_split_path_info已启用:fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
验证与调试方法
在public/index.php开头加调试代码:
var_dump([
'REQUEST_URI' => $_SERVER['REQUEST_URI'],
'PATH_INFO' => $_SERVER['PATH_INFO'] ?? 'MISSING',
'QUERY_STRING'=> $_SERVER['QUERY_STRING'],
'SCRIPT_NAME' => $_SERVER['SCRIPT_NAME'],
]); die;
访问https://yoursite.com/新闻/热点,观察输出:
- 若
REQUEST_URI显示/新闻/热点但PATH_INFO为空 → 检查fastcgi_split_path_info和PATH_INFO传递 - 若
REQUEST_URI变成/%E6%96%B0%E9%97%BB/%E7%83%AD%E7%82%B9(URL编码)且无解码 → Nginx未交给PHP处理,还在静态层拦截,回头查try_files位置和root指向 - 若
REQUEST_URI是乱码(如闻点)→ 客户端或浏览器发送异常,非服务器问题



















