WordPress中$_SERVER['QUERY_STRING']为何为空?
这种情况核心是请求在WordPress或服务器层面的处理过程中,查询参数未被正确传递,具体可以从这几个方向排查:
服务器重写规则未保留查询字符串:不管是Apache还是Nginx,如果你为自定义API路径配置了重写规则但没加保留查询参数的标志,原请求的
?category=news会被直接丢弃。比如Apache的.htaccess里没加QSA(Query String Append),Nginx配置里没带?$args,都会导致QUERY_STRING和$_GET为空。REST API路由未声明参数:WordPress REST API默认只会识别路由注册时明确声明的参数。如果你的
/api/v1/articles路由注册时没在args里定义category参数,API会自动忽略这个未声明的参数,自然不会写入$_GET。URL转义与解析错误:你看到
REQUEST_URI里的转义斜杠是输出时的格式问题,但如果实际重写过程中,查询参数被错误解析成了路径的一部分,服务器就不会把它当作查询字符串处理。插件或自定义代码干扰:缓存插件、安全插件,或者你自己写的
pre_get_posts这类钩子,可能在请求处理流程中过滤、清空了$_GET变量。
快速验证与修复建议
检查服务器重写规则:
- Apache的
.htaccess里,确保重写规则带QSA标志:RewriteRule ^api/v1/articles$ /wp-json/api/v1/articles [QSA,L] - Nginx配置中,要追加
?$args保留参数:location /api/v1/articles { rewrite ^/api/v1/articles$ /wp-json/api/v1/articles?$args last; }
- Apache的
修正REST API路由注册:注册路由时明确声明
category参数,示例:register_rest_route( 'api/v1', '/articles', array( 'methods' => 'GET', 'callback' => 'my_articles_callback', 'args' => array( 'category' => array( 'required' => false, 'sanitize_callback' => 'sanitize_text_field' ), ), ) );之后在回调里可以通过
$request->get_param('category')获取,$_GET也会同步拿到参数。排查插件冲突:临时禁用所有非必要插件,测试请求是否恢复正常,逐步定位干扰插件。
内容的提问来源于stack exchange,提问作者Henry

