【问题标题】:Error while posting data using PHP CURL library on production server在生产服务器上使用 PHP CURL 库发布数据时出错
【发布时间】:2018-04-17 12:44:14
【问题描述】:

目前,我正在使用 PHP CURL 发布数据以调用 API。 我已经实现了 PHP cURL 来将 client_id、client_secret 值发布到我的 API。 CURL 在我的本地服务器上运行,但在我的生产服务器上却抛出错误。

Error: "cURL error (7): Couldn't connect to server".

PHP 版本 5.6.24

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
if($_POST['grant_type'] != "authorization_code") 

curl_setopt($ch, CURLOPT_USERPWD, "$client_id:$client_secret");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXYPORT, "443");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_ENCODING, "");

curl_setopt($ch, CURLOPT_USERAGENT, "spider");
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_SSLVERSION, 3);
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 600);      
curl_setopt($ch, CURLOPT_TIMEOUT, 600);            
curl_setopt($ch, CURLOPT_AUTOREFERER, true);

$output = curl_exec($ch);
$info = curl_getinfo($ch);

if($errno = curl_errno($ch)) {
    $error_message = curl_strerror($errno);
    echo "cURL error ({$errno}):\n {$error_message}";
}

curl_close($ch);

【问题讨论】:

  • 您的生产服务器可能不允许来自它的连接。尝试网络调试命令(ping、traceroute、telnet、...)进行确认。然后与您的网络人员联系以打开路由,或修改防火墙。或者,如果这是托管的,请验证您正在使用的托管商的使用条款。这个问题很笼统,可以提供任何准确的答案。
  • 请发布您的 cURL 配置和 PHP 版本。此外,生产服务器可能会强制执行 SELinux 和 FirewallD。请务必检查您的端口和访问权限。这只是一个开始。您可能没有对本地开发人员实施任何安全措施。
  • 请正确检查网址和凭据。
  • 您请求端口 443 进行身份验证,但您是否使用端口 443 进行登录?登录端口 80,在安全之前是不安全的吗?如果您尝试删除 CURLOPT_PROXYPORT 会怎样?如果代理在标准端口上运行,则不需要。你检查过 SELinux 和 FirewallD 了吗?如果没有适当的权限/访问权限,这一切都不会起作用。
  • 这些是大多数 Linux 发行版中的安全协议。您可以在命令行上输入以下命令检查 SELinux:getenforce 您可以输入以下命令检查 FirewallD:sudo firewall-cmd --state 使用 man firewall-cmd 获得更多选项您运行的是哪种 Linux?

标签: php linux api curl server


【解决方案1】:

这些是大多数 Linux 发行版中的安全协议。您可以在命令行中输入以下命令检查 SELinux:getenforce 您可以通过输入以下命令检查 FirewallD:sudo firewall-cmd --state 使用 man firewall-cmd 获取更多选项。

您可以使用sudo firewall-cmd --list-all 查找允许http/https 的区域。只要让我知道您发现了什么,我可以帮助您执行其他命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多