自定义WordPress REST API传阿拉伯语搜索参数报404问题
问题根源
你遇到的阿拉伯语参数触发rest_no_route404错误,和Unicode处理、JSON编码无关,核心是三个代码层面的问题:
- 路由正则的命名捕获组语法写错:你写的
(?p<request>.+)不符合PCRE正则规范,命名组的P必须大写,小写p会导致非ASCII字符场景下正则匹配直接失效 - 直接把多字节的阿拉伯语字符放在URL路径段做匹配时,没有开启路由的UTF-8多字节支持,很容易触发路径校验拦截
- 回调里多余的
JSON_encode操作没有实际意义,还可能导致参数解析异常
推荐解决方案(兼容性最高)
不要把搜索关键词作为路径段捕获,改用REST API标准的查询参数传参,彻底规避多字节字符路径匹配问题。
修正后的路由注册代码
add_action('rest_api_init', function() { register_rest_route( 'wm/v1', '/search', array( 'methods' => WP_REST_Server::READABLE, 'callback' => 'wm_search_post', 'args' => array( 'request' => array( 'required' => true, 'sanitize_callback' => 'sanitize_text_field' ) ) ) ); });
修正后的回调函数代码
function wm_search_post(WP_REST_Request $request){ // 直接获取参数即可,WordPress会自动完成URL解码、多字节字符解析 $search_keyword = $request->get_param('request'); return [ 'received_keyword' => $search_keyword ]; }
调用方式
请求时把阿拉伯语搜索词作为查询参数传入即可,示例端点格式:/wp-json/wm/v1/search?request=你的阿拉伯语搜索词
浏览器会自动对非ASCII字符做URL编码,WordPress端会自动还原,不会出现404问题。
备选方案(坚持用路径传参的场景)
如果一定要把搜索词放在URL路径里,需要修正正则语法同时开启UTF-8多字节匹配支持:
add_action('rest_api_init', function() { // 注意正则里P大写,最后register_rest_route第四个参数传true开启utf8支持 register_rest_route( 'wm/v1', '/search/(?P<request>.+)', array( 'methods' => WP_REST_Server::READABLE, 'callback' => 'wm_search_post', ), true ); });
注意:该方案在部分配置了特殊路径字符拦截的Nginx/Apache环境下依然可能失效,优先选择查询参数传参的方案。
内容的提问来源于stack exchange,提问作者eng.malek
相关产品推荐
相关产品推荐

