标签: curl

  • 如何修复WordPress网站关于cURL错误

    错误类型:
    WP内部错误
    错误名称:
    REST API遇到了错误
    英文名称:
    cURL error 28
    错误描述:
    无法及时响应服务器的数据请求会导致WordPress中出现“cURL error 28”报错。

    “cURL error 28” 是常见的WordPress REST API问题,可能会影响网站的性能,并可能导致网站运行异常。

    在本教程中,将详细介绍如何解决WordPress网站上的“cURL error 28: Connection timed out”问题。

    cURL error 28

    WordPress的cURL是什么?

    cURL是WordPress和许多其他Web应用使用的软件实用工具,用于使用URL发送和接收数据请求。

    WordPress使用cURL处理多个API请求。它可以作为PHP编程语言的扩展使用,WordPress托管服务会为此提供帮助。

    cURL库在WordPress后台工作中起着至关重要的作用。如果未正确配置,则WordPress网站将无法正常运行。

    什么导致WordPress发生“cURL error 28”?

    无法及时响应服务器的数据请求会导致WordPress中出现“cURL error 28”报错。

    WordPress使用REST API(一种编程技术)来发送和接收数据请求。如果这些请求超时,那么您将在“站点运行状况”报告中将其视为标题为“REST API遇到了错误”的关键问题。

    “cURL error 28”报错

    如果你展开该问题可以查看更多详细信息,包括错误消息:

    Error: cURL error 28: Operation timed out after x milliseconds with x bytes received (http_request_failed)

    您可能还会看到标题为“您的站点不能完成环回请求”的另一个相关问题。它将显示类似的错误消息,具体描述如下。

    “到您站点的环回请求失败,这意味着依赖此种请求的功能将不能正常工作。”

    什么可能导致cURL超时?

    许多情况可能导致WordPress发生cURL超时。

    例如,WordPress防火墙插件可能会将其视为可疑活动而阻止REST API请求。

    如果您的DNS服务器无法正常工作,则这也可能导致HTTP请求失败并导致WordPress出现cURL超时错误。

    WordPress托管服务器配置不当-设置较低超时阈值,这也可能会阻止某些WordPress进程正常运行。

    既然我们大致知道导致cURL错误的原因,那么要解决话“curl error 28: Connection timed out”问题就不应该是一件难事了。

    1. 暂时禁用WordPress防火墙

    如果安装了WordPress防火墙或安全插件,可以暂时将其停用。

    禁用WordPress防火墙

    然后,访问WordPress网站后台-工具-站点健康,查看问题是否已解决。

    如果发现问题已解决,则需要检查WordPress防火墙日志以查看哪些API请求已被阻止。

    以帮助您确定问题的根源,进一步调整防火墙设置以不阻止合法的API请求。

    2. 禁用所有WordPress插件

    WordPress插件自身产生API请求以发送和接收数据。如果这些调用过于频繁或耗时太长才能完成,则可能会导致站点健康中出现cURL错误。

    解决此问题的最简单方法是停用所有WordPress插件。只需转到“插件»已安装插件”页面,然后勾选所有插件。

    禁用所有WordPress插件

    之后,点击批量操作下拉菜单选择“禁用”,然后点击“应用”按钮。

    再次访问“站点健康”报告,以查看问题是否已消失。如果这解决了问题,那么您可以尝试逐个启用插件,直到问题再次出现,即可找到问题插件。

    联系插件开发者解决问题,又或者使用替代品。

    3. 确保服务器正在使用最新版本软件

    下一步是确保WordPress服务器使用最新版本的PHP,cURL库和OpenSSL。

    您可以通过查看“工具”»“站点健康”页面下的系统信息选项卡来进行检查。

    站点健康

    只需切换到“信息”标签,然后展开“服务器”部分。即可获取有关WordPress服务器上安装的软件的信息。

    WordPress服务器信息

    理想情况下,服务器应使用PHP 7.4.13或更高版本,curl 7.74.0或更高版本以及OpenSSL 1.1.1或更高版本。

    如果没有,那么自行进行版本升级或者联系服务器提供商城升级。注:VPS服务器一般可以自行进行升级操作,虚拟主机则可能要依赖服务器提供商。

    4. 修复SSL不安全内容问题

    如果您的WordPress网站使用HTTPS/SSL,但配置不正确,这也可能导致Web服务器阻止不安全的cURL请求。

    同样,如果WordPress网站未使用HTTPS/SSL,但是使用HTTPs URL进行了API调用,那么这些请求也会失败,并且您可能会看到以下cURL错误:

    Error: cURL error 7: Failed to connect to localhost port 443: Connection refused (http_request_failed)

    cURL error 7

    要解决此问题,您可以要求托管服务提供商或者自行为您的网站重新安装SSL证书。如果问题仍然存在,进一步查看常见的SSL问题,正确设置网站SSL。

    5.向服务器提供商寻求帮助

    如果上述步骤未能解决WordPress网站上的cURL错误28,则该问题很可能是服务器环境问题。

    有许多因素只能由服务器提供商控制和修复。例如,如果其DNS服务器无法及时解析请求,则这将导致cURL请求超时。

    另一种情况可能是主机服务器的连接速度慢或网络问题。

    只需向他们发送带有错误详细信息的支持请求,他们的技术人员就可以进行故障排除并应用修复程序来解决。

  • 如何修复cURL error 60: SSL certificate problem: certificate has expired问题

    错误类型:
    WP内部错误
    错误名称:
    SSL证书已过期
    英文名称:
    cURL error 60: SSL certificate problem: certificate has expired
    错误描述:
    WP core有一个根证书文件,/wp-includes/certificates/ca-bundle.crt用于检查通过HTTP API创建的所有请求的SSL。在此文件中,用于为您的站点创建证书的根证书之一已过期。因此,请求无法通过验证并生成此错误。

    curl错误修复

    从2021年9月30日起,HTTP API请求可能会停止在安装了Let’s Encrypt证书的WordPress网站上工作。此前我们有提醒过大家注意Let’s Encrypt根证书将过期可能会带来问题

    例如,这样的请求会导致错误:

    $res = wp_remote_get( ‘https://wp-kama.com/’ );
    if( is_wp_error( $res ) ){
    echo $res->get_error_message();
    }
    $res = wp_remote_get( ‘https://wp-kama.com/’ );

    if( is_wp_error( $res ) ){
    echo $res->get_error_message();
    }

    $res = wp_remote_get( 'https://wp-kama.com/' );
    
    if( is_wp_error( $res ) ){
    echo $res->get_error_message();
    }

    然后你就会遭遇下方的报错提示:

    cURL error 60: SSL certificate problem: certificate has expired

    这样的错误将随处可见,例如:

    • 在WP管理面板检查WordPress更新时。
    • 检查插件更新时。
    • 访问任何服务的api时。例如,TinyPNG图像压缩以及其他一些使用任何类型请求的插件。

    为什么我们看到错误证书已过期?

    简而言之,WP core有一个根证书文件,/wp-includes/certificates/ca-bundle.crt用于检查通过HTTP API创建的所有请求的SSL。在此文件中,用于为您的站点创建证书的根证书之一已过期。因此,请求无法通过验证并生成此错误。

    更详细的解释:

    在不详细介绍的情况下,对于非专业人士来说几句关于为什么到期 DST Root CA X3证书将影响Let’s Encrypt颁发的证书。每个验证证书的系统都有自己的可信根证书存储库。系统将信任在验证期间使用这些根证书之一的私钥签名的证书。根证书本身通常有很长的到期日期,很少更改并且在生成最终主题证书(在这种情况下是域名证书)时不使用,相反,公钥基础设施意味着使用信任链 – 根证书用于签署中间证书和已经使用它们来签署最终主题证书(域证书)。此外,为了让系统信任最终主题证书,它必须能够跟踪从该证书到它信任的根证书之一的完整链。

    当Let’s Encrypt出现时,它的ISRG Root X1根证书(就像任何新的根证书一样)无法快速进入大量系统的受信任证书库。同时,为了项目的成功运行,从一开始就颁发的证书必须受到最大数量的“开箱即用”系统的信任(这些系统的用户没有任何额外的操作)。在这方面,对于证书,Let’s Encrypt开始使用通向根证书的信任链DST Root CA X3,这是大多数系统认可的。

    随着下一次WP更新,此错误将会自行消失,但如果您今天需要解决方案,或者您不打算更新WordPress,但需要有效的HTTP请求,请执行以下操作。

    cURL error 60: SSL certificate has expired解决办法

    您需要更新/wp-includes/certificates/ca-bundle.crt文件的内容,将其更改为https://curl.se/ca/cacert.pem文件的内容。

    在这种情况下更改核心文件是可以接受的,因为下次更新WP时,问题就会消失。你可以在GitHub上查看相应的提交

    手动替换内容更新以解决问题

    1. 下载此文件https://curl.se/ca/cacert.pem
    2. 使用上述下载以更新/wp-includes/certificates/ca-bundle.crt的内容。
    3. Done!报错将会销声匿迹。

    或添加代码片段以修复报错

    当您能够从管理面板运行代码时,使用代码会很方便,例如使用代码片段插件。

    1. 将以下代码添加到 themes functions.php 文件中(或在 Code Snippets 插件中):
      /**
      * Goto http://yoursite.com/?update-wp-ca-bundle
      */
      if( isset( $_GET[‘update-wp-ca-bundle’] ) ){
      $crt_file = ABSPATH . WPINC . ‘/certificates/ca-bundle.crt’;
      $new_crt_url = ‘http://curl.haxx.se/ca/cacert.pem’;
      if( is_writable( $crt_file ) ){
      $new_str = file_get_contents( $new_crt_url );
      if( $new_str && strpos( $new_str, ‘Bundle of CA Root Certificates’ ) ){
      $up = file_put_contents( $crt_file, $new_str );
      echo $up ? ‘OK: ca-bundle.crt updated’ : ‘ERROR: can`t put data to ca-bundle.crt’;
      }
      else {
      echo ‘ERROR: can’t download curl.haxx.se/ca/cacert.pem’;
      }
      }
      else {
      echo ‘ERROR: ca-bundle.crt not writable’;
      }
      exit;
      }
      /**
      * Goto http://yoursite.com/?update-wp-ca-bundle
      */
      if( isset( $_GET[‘update-wp-ca-bundle’] ) ){

      $crt_file = ABSPATH . WPINC . ‘/certificates/ca-bundle.crt’;
      $new_crt_url = ‘http://curl.haxx.se/ca/cacert.pem’;

      if( is_writable( $crt_file ) ){
      $new_str = file_get_contents( $new_crt_url );

      if( $new_str && strpos( $new_str, ‘Bundle of CA Root Certificates’ ) ){
      $up = file_put_contents( $crt_file, $new_str );

      echo $up ? ‘OK: ca-bundle.crt updated’ : ‘ERROR: can`t put data to ca-bundle.crt’;
      }
      else {
      echo ‘ERROR: can’t download curl.haxx.se/ca/cacert.pem’;
      }
      }
      else {
      echo ‘ERROR: ca-bundle.crt not writable’;
      }

      exit;
      }

      /**
       * Goto http://yoursite.com/?update-wp-ca-bundle
       */
      if( isset( $_GET['update-wp-ca-bundle'] ) ){
      
      $crt_file = ABSPATH . WPINC . '/certificates/ca-bundle.crt';
      $new_crt_url = 'http://curl.haxx.se/ca/cacert.pem';
      
      if( is_writable( $crt_file ) ){
      $new_str = file_get_contents( $new_crt_url );
      
      if( $new_str && strpos( $new_str, 'Bundle of CA Root Certificates' ) ){
      $up = file_put_contents( $crt_file, $new_str );
      
      echo $up ? 'OK: ca-bundle.crt updated' : 'ERROR: can`t put data to ca-bundle.crt';
      }
      else {
      echo 'ERROR: can't download curl.haxx.se/ca/cacert.pem';
      }
      }
      else {
      echo 'ERROR: ca-bundle.crt not writable';
      }
      
      exit;
      }

      使用后,删除此代码。

    2. 访问http://YOURSITE.com/?update-wp-ca-bundle页面。(替换YOURSITE.com到您的域名…)
    3. Done!一切都应该像以前一样工作。