Nginx或PHP为何将空格转为下划线?如何解决该问题?
问题解答
1. 空格转下划线的来源
这个转换是PHP完成的,和Nginx无关。PHP默认会将GET/POST参数名中的非字母数字字符(包括空格、连字符等)替换为下划线,目的是让参数名符合PHP变量命名规则(变量名只能包含字母、数字和下划线,且不能以数字开头)。哪怕你直接访问index.php?this folder,PHP也会自动把参数名转为this_folder存入$_GET。
2. 获取原始带空格的参数名的方法
要绕过PHP的自动转换,需要直接读取原始的查询字符串并手动解析,而不是依赖$_GET数组:
// 获取Nginx传递过来的原始查询字符串 $rawQuery = $_SERVER['QUERY_STRING']; // 手动解析原始查询字符串,保留原始参数名 $originalParams = []; foreach (explode('&', $rawQuery) as $paramPair) { // 分割键值对,最多分割1次,避免值里包含=的情况 [$key, $value] = explode('=', $paramPair, 2) + ['', '']; // 解码URL编码的键和值 $originalKey = rawurldecode($key); $originalValue = rawurldecode($value); $originalParams[$originalKey] = $originalValue; } // 现在可以通过$originalParams['this folder']获取原始参数 echo $originalParams['this folder'];
补充说明
Nginx的rewrite指令只是将路径部分原样转为查询字符串(比如this%20folder会被完整传递给PHP),并没有修改参数名。你可以查看Nginx的访问日志,确认传递给PHP的查询字符串是原始编码后的内容,进一步验证这一点。
内容的提问来源于stack exchange,提问作者Martijn Balink
相关产品推荐
相关产品推荐

