为什么PHP中的Curl Request有时可以工作而其他的却不能?

时间:2019-04-17 13:19:23

标签: php curl

在ubuntu服务器上,我正在运行以下PHP代码,有时它可以工作,有时却不能。代码中被注释的部分已经测试了所有可能的变体,但没有成功。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.americanas.com.br/');
//curl_setopt($ch, CURLOPT_CAINFO, '/etc/ssl/certs/ca-certificates.crt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
//curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 0);
//curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_STDERR, fopen(dirname(__FILE__).'/errorlog.txt', 'w'));
//curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
//curl_setopt($ch, CURLOPT_SSLVERSION, 4);
$result = curl_exec($ch);


curl_exec($ch);
print_r(curl_getinfo($ch));
print_r(curl_error($ch));

下面是它的快照,我能够通过返回两个请求来处理,一个有效,一个无效。我注意到每个请求都指向不同的IP,并且服务器的证书也会更改。

a busy cat

在同一服务器上,始终可以通过命令行执行相应的请求:

curl --verbose https://www.americanas.com.br

有人可以解释为什么吗?

4 个答案:

答案 0 :(得分:1)

经过多次测试,我得出了一些结论。

该站点的每个结构似乎都在服务器集群的后面,这解释了在各种DNS服务中解析其DNS时的大量IP。

这是我的特殊问题,是由我的主机使用的DNS服务器引起的。它将IP返回给无法通过PHP处理我的cURL请求的网站。

我能够通过更改请求的DNS服务器来解决此问题:

curl_setopt($ch, CURLOPT_DNS_SERVERS, '1.1.1.1,8.8.8.8');

手动选择IP也可以。

curl_setopt($ch, CURLOPT_RESOLVE, ['www.americanas.com.br:443:23.36.73.68']);

我从这个问题中学到了很多新东西,希望对其他人有用。

答案 1 :(得分:1)

它与执行curl请求的服务器无关,它与域本身和域的dns(如cloudflare)有关,如果网站已检查http和https请求,那么它可能会部分阻止请求,因此您发出请求,给出响应,而其他人阻止

答案 2 :(得分:0)

On the same server, executing a corresponding request via the command line always works

唯一的区别应该是用户代理。

curl cli程序总是添加用户代理,libcurl不会,并且许多网站阻止没有用户代理标头的请求。 GoogleDNS知道www.americanas.com.br的3种不同服务器,我猜它们的 Some 服务器允许没有用户代理标头的请求,而有些服务器则不允许。

$ nslookup www.americanas.com.br
Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
www.americanas.com.br   canonical name = wildsan.b2wdigital.com.edgekey.net.
wildsan.b2wdigital.com.edgekey.net      canonical name = e6654.dscg.akamaiedge.net.
Name:   e6654.dscg.akamaiedge.net
Address: 23.52.34.144
Name:   e6654.dscg.akamaiedge.net
Address: 2a02:26f0:e2:48c::19fe
Name:   e6654.dscg.akamaiedge.net
Address: 2a02:26f0:e2:4a1::19fe

如果我是正确的,那么解决方案是添加User-Agent标头,如果您想成为通用标头,则类似

curl_setopt($ch,CURLOPT_USERAGENT,'libcurl/' . (curl_version()['version']) . ' php/' . PHP_VERSION);
  • 编辑:起初,我在写这篇文章的时候没时间了,原始版本没有多大意义,现在应该有意义。

答案 3 :(得分:0)

现在情况越来越清楚了。该网站使用Akamai的服务,类似于cloudflare。

例如,各种服务器中的一些正在阻止用户代理的请求,例如标准浏览器所使用的请求。

由于用户代理:curl / 7.50.3未被锁定,上述朋友指出的解决方案将与通过终端运行一样有效。

我刚发送了一个带有随机User-Agent和.... Bingo的请求。效果很好。