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
相关产品推荐
相关产品推荐

