Debian9 Apache2环境下PHP调用file_get_contents请求Trello API返回426错误如何解决?
问题根因
报错HTTP/1.1 426 Upgrade Required的核心原因是Trello API要求请求必须使用HTTP/1.1及以上协议版本、TLS1.2及以上加密协议,而Debian9源自带的PHP7默认配置下,file_get_contents发起请求时默认使用HTTP/1.0协议,TLS版本也可能不满足要求,因此触发接口拒绝。你本地XAMPP环境没有问题是因为XAMPP自带的PHP版本已经默认配置了高版本HTTP、TLS作为请求默认参数。
解决方案
方案1:修改file_get_contents请求配置,添加自定义流上下文
在原有代码基础上添加上下文配置,强制指定协议版本即可:
// 构造请求上下文配置 $opts = [ 'http' => [ 'method' => 'GET', 'protocol_version' => 1.1, // 强制使用HTTP/1.1协议 'header' => [ 'Connection: close' // 单请求关闭长连接,避免资源占用 ] ], 'ssl' => [ 'verify_peer' => true, 'verify_peer_name' => true, 'min_ssl_version' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT // 强制使用TLS1.2及以上版本 ] ]; $context = stream_context_create($opts); // 携带上下文发起请求 $lists = json_decode(file_get_contents("https://api.trello.com/1/boards/<<HIDDEN>>/lists?key={$id}&token={$token}", false, $context), true);
方案2:换用cURL发起请求(更稳定,推荐)
cURL的兼容性、可配置性优于file_get_contents,是调用外部API的首选方案:
- 首先安装PHP cURL扩展,Debian9下执行命令:
# 请将7.0替换为你实际安装的PHP大版本号,如7.2则改为php7.2-curl apt update && apt install -y php7.0-curl # 安装完成后重启Apache生效 systemctl restart apache2
- 替换原有代码为cURL实现:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://api.trello.com/1/boards/<<HIDDEN>>/lists?key={$id}&token={$token}"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); $response = curl_exec($ch); if (curl_errno($ch)) { // 自行补充错误处理逻辑 $error_msg = curl_error($ch); } curl_close($ch); $lists = json_decode($response, true);
内容的提问来源于stack exchange,提问作者Christopher Chauve
相关产品推荐
相关产品推荐

