You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP连接EPP服务器出现Received HTTP/0.9 when not allowed错误求助

错误原因说明

这个报错的核心是高版本cURL默认禁止接收HTTP/0.9协议响应,而EPP协议原生是基于裸TCP传输XML的,并不是标准HTTP协议,你用HTTP POST请求EPP标准端口,服务端返回的非HTTP响应被cURL识别为HTTP/0.9格式直接拦截。

排查思路
  • 先确认目标EPP服务的接入协议:大部分域名注册局的EPP服务走的是TCP over TLS,不是HTTPS协议,你当前用HTTPS请求700端口本身就大概率是协议不匹配
  • 开启cURL debug日志验证响应内容:在代码中加入curl_setopt($curl, CURLOPT_VERBOSE, true);,打印完整的请求响应交互,确认服务端返回的内容是不是裸EPP XML,没有HTTP头
  • 验证端口协议:用openssl s_client命令直接连目标端口测试:openssl s_client -connect xxxxx.com:700,手动输入EPP XML,看返回是否直接是EPP响应报文,没有HTTP状态行、响应头这类内容
解决方案

方案1:EPP服务走标准TCP TLS(99%的注册局EPP都是这个方案)

直接弃用cURL的HTTP请求逻辑,用PHP的stream套接字处理:

// 连接EPP TLS服务
$eppHost = 'tls://xxxxx.com';
$eppPort = 700;
$timeout = 30;

$socket = stream_socket_client(
    "$eppHost:$eppPort",
    $errno,
    $errstr,
    $timeout,
    STREAM_CLIENT_CONNECT,
    stream_context_create([
        'ssl' => [
            'verify_peer' => true,
            'verify_peer_name' => true,
            'allow_self_signed' => false,
        ]
    ])
);

if (!$socket) {
    throw new Exception("EPP连接失败: $errstr ($errno)");
}

// 发送EPP XML,注意EPP协议需要先发送4字节的报文长度(大端序)+ 报文内容
$eppXml = '你的完整EPP XML内容';
$packet = pack('N', strlen($eppXml) + 4) . $eppXml;
fwrite($socket, $packet);

// 读取响应
$responseHeader = fread($socket, 4);
$length = unpack('N', $responseHeader)[1] - 4;
$responseXml = fread($socket, $length);

fclose($socket);

注意:标准EPP协议要求每个报文前加4字节大端序的报文总长度(包含长度本身的4字节),不要直接裸发XML

方案2:确认目标服务确实是HTTP接口

可以临时允许cURL接收HTTP/0.9响应,在cURL配置中加入:

curl_setopt($curl, CURLOPT_HTTP09_ALLOWED, true);

这个参数在cURL 7.64.0及以上版本支持,开启后就不会拦截HTTP/0.9格式的响应。

补充注意事项
  • EPP协议有标准的报文格式规范,不要漏报文长度头,否则服务端会直接断开连接
  • 生产环境使用EPP需要处理登录会话保活、报文ID对应、错误码解析等逻辑,建议优先找成熟的PHP EPP客户端库二次开发
  • 不要忽略SSL证书校验,避免中间人攻击风险

内容的提问来源于stack exchange,提问作者Mick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:36:04