WordPress自定义插件调用REST API返回503 Service Unavailable问题求助
问题解决步骤
- 第一步:先给现有cURL代码补充调试逻辑,明确503的来源
你可以先将代码修改为以下版本,打印出请求的详细状态和错误信息,确认503是目标API返回还是本地服务器抛出的错误:
protected function getGetData($url,$token){ $curl = curl_init(); $auth= 'Authorization: Bearer '.$token; curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_HTTPHEADER => array( $auth, // 模拟Postman的请求头,避免WAF拦截 'User-Agent: PostmanRuntime/7.39.0', 'Accept: */*', 'Connection: close' ), // 禁用长连接复用,每次新建请求,解决首次成功后续失败的问题 CURLOPT_FORBID_REUSE => true, CURLOPT_FRESH_CONNECT => true, )); $response = curl_exec($curl); // 新增调试信息 $err = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); if ($err) { error_log('cURL错误:'.$err); } error_log('请求返回状态码:'.$httpCode); return $response; }
大部分首次请求正常后续返回503的问题都和请求头缺失被目标API的WAF拦截、长连接被标记异常有关,补充上述配置后即可解决。
- 第二步:优先使用WordPress原生HTTP API替换自定义cURL代码
WordPress原生的wp_remote_get方法已经适配了服务器环境的各类配置,兼容性远高于自定义cURL,对应写法如下:
protected function getGetData($url,$token){ $response = wp_remote_get($url, array( 'headers' => array( 'Authorization' => 'Bearer '.$token, 'User-Agent' => 'PostmanRuntime/7.39.0', 'Accept' => '*/*' ), 'timeout' => 10, 'redirection' => 10, 'httpversion' => '1.1', 'blocking' => true, )); if (is_wp_error($response)) { error_log('请求错误:'.$response->get_error_message()); return false; } $httpCode = wp_remote_retrieve_response_code($response); error_log('请求返回状态码:'.$httpCode); return wp_remote_retrieve_body($response); }
- 第三步:排查服务器层面拦截规则
如果上述修改无效,检查WordPress所在服务器的Apache配置:- 确认
mod_security、mod_evasive模块是否设置了出站请求频率限制,拦截了多次去往目标API的请求 - 确认
.htaccess文件没有添加限制出站请求的自定义规则 - 确认服务器防火墙没有对目标API的IP做访问频率限制
- 确认
内容的提问来源于stack exchange,提问作者Daniele Giannini
相关产品推荐
相关产品推荐

