使用PHP POST调用Cloudflare API更新DNS记录报错:POST方法不被允许
问题解决:Cloudflare API更新DNS记录报错“POST method not allowed”
错误原因
Cloudflare的DNS记录更新接口(URL包含dns_records/{{recordID}})要求使用PUT请求方法,而非POST。POST方法仅用于创建新DNS记录(URL不带recordID),当用POST调用更新接口并搭配api_token认证时,就会触发该权限错误。
代码修正
只需将PHP中的POST请求改为PUT请求即可解决问题,修改点如下:
原代码中设置POST请求的代码:
curl_setopt($curl, CURLOPT_POST, true);
替换为:
// 改用PUT请求方法 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
完整修正后的代码
include("../../env.php"); //variable input by POST $domain = $_POST['domain']; $recordID = $_POST['recordID']; $content = $_POST['content']; $zoneID = $_POST['zoneID']; //for update record $linkRecord = "https://api.cloudflare.com/client/v4/zones/$zoneID/dns_records/$recordID"; $header = array( "Content-Type: application/json", "Authorization: Bearer $authToken" ); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $linkRecord); // 修改为PUT请求 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $header); $bodyArray = array("type"=>"A","name"=>$domain,"content"=>$content,"proxied"=>true); $body = json_encode($bodyArray); curl_setopt($curl, CURLOPT_POSTFIELDS, $body); $resp = curl_exec($curl); print_r($resp);
补充说明
你在Postman中能正常运行,大概率是因为Postman里选择的是PUT方法,而PHP代码误写成了POST。PHP完全支持带Token的POST/PUT请求,问题本质是请求方法与Cloudflare API接口的要求不匹配。
内容的提问来源于stack exchange,提问作者Meikel Rizky Hartawan
相关产品推荐
相关产品推荐

