【问题标题】:PHP Curl Cannot Connect to Host on Own ServerPHP Curl 无法连接到自己服务器上的主机
【发布时间】:2011-08-22 09:18:56
【问题描述】:

我有一个 PHP 脚本,它使用 cURL 来访问也位于我的服务器上的文件(安装的电子邮件营销程序)。我写了一个快速脚本来测试我的 cURL 安装,当指向我自己服务器上的文件时它失败了。脚本是:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/test.php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$contents = curl_exec($ch);

if($contents) {
    echo $contents;
} else {
    $err = curl_error($ch);
    echo $err;
}

curl_close($ch);

当我运行这段代码时,它返回一个错误:无法连接到主机

如果我将 URL 更改为 http://www.google.com 或任何其他网站,它就可以正常工作。此外,当我尝试在另一台服务器上通过 cURL 打开特定页面时,它的工作方式应该如此。我从这些测试中做出的假设是 PHP cURL 已安装并且(有点)工作,并且问题不在试图打开的页面中。

我认为这可能是端口问题,所以我尝试指定具有相同结果的端口(未连接到主机)。我尝试了curl_setopthttp://www.mysite.com:80/ 来指定我知道要打开的端口。

这让我相信问题出在我的 apache 安装中,但我不是 apache 专家,而且我整天都在与 Google 争吵,但无济于事。有什么想法会导致这种特定的 cURL 失败吗?

【问题讨论】:

  • 你解决过这个问题吗?我有完全相同的问题,当我通过浏览器访问时,我自己服务器上的脚本工作正常,但是当我运行 cURL 从子域访问它时,它失败并出现错误 7。

标签: php apache curl apache2


【解决方案1】:

遇到了同样的问题,我的域名无法在服务器上解析,导致 CURL 对自身的请求失败。

我的问题是,由于某些防火墙规则,我的 Web 服务器无法自行解析(Web 服务器前面有一个负载平衡器阻止来自服务器的流量)。

换句话说,在我的服务器上运行以下命令

curl -I http://www.mywebserver.com 导致:

$ curl -I http://www.mywebserver.com curl: (7) couldn't connect to host

更新服务器上的 /etc/hosts 文件以将域名映射到本地 IP 地址解决了问题,并且我的脚本中的 fopencurl 再次起作用。

【讨论】:

  • 我知道这个问题是很久以前提出的,但我想给你一个赞成票,因为这是在拉了一天头发后对我有用的解决方案。
  • 非常感谢,经过很长时间,这对我也有用。每次尝试访问 api 时,我都会在 wordpress 上遇到 cURL 超时,但查询监视器说这是某种 ssl 错误,尽管我可以从终端卷曲 https url。然后我决定尝试我自己的域,它也超时了,这很奇怪,因为我可以通过浏览器很好地访问 WP API,结果唯一需要的是在主机文件中为具有本地域的域添加一个条目知识产权。之后一切正常。
【解决方案2】:

你能pingwww.mysite.com吗?

检查您的 /etc/hosts ... 可能为 www.mysite.com 指定了错误的 IP。

【讨论】:

    【解决方案3】:

    尝试在网络浏览器中打开http://www.mysite.com/test.php。如果它有效,那么问题出在 cURL 上。如果不是,那么问题出在您的网络或 apache 配置上。

    您可以检查您的 apache 配置,确保它在您的系统上运行。然后尝试从命令行telnet <apache server ip> 80。连接后尝试执行以下操作:

    GET /test.php HTTP/1.1
    Host: www.mysite.com
    <2 line breaks>
    

    如果您收到来自 apache 的响应,那么这听起来像是网络问题。确保 mysite.com 解析为您的 apache 服务器的 IP 地址,并且端口 80 流量可以到达您的服务器。这也可能是您的路由器尝试向其自己的 IP 地址发出请求的环回路由问题(假设您的 apache 机器位于路由网络连接后面,与您所在的连接相同)。

    【讨论】:

      【解决方案4】:

      我也在远程网络服务器上遇到了这个问题。在这台机器上运行 curl 我无法访问同一台机器上的 apache 服务器托管的文件。奇怪的是我可以通过

      访问文件
      curl -O http://example.com/file1.txt
      

      但是

      curl -0 http://sub.example.com/file1.txt
      

      没用。

      我通过将丢失的 DNS 记录添加到机器上运行的 DNS 服务器来解决它。似乎nslookup 等在询问其他人之前先查看本地 DNS 服务器。当本地 DNS 服务器回复“找不到”时,curl 放弃了。

      【讨论】:

        猜你喜欢
        • 2016-05-08
        • 1970-01-01
        • 2015-02-12
        • 2021-08-04
        • 1970-01-01
        • 2015-09-05
        • 2020-02-01
        • 2013-07-31
        • 1970-01-01
        相关资源
        最近更新 更多