在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,并且服务器的证书也会更改。
在同一服务器上,始终可以通过命令行执行相应的请求:
curl --verbose https://www.americanas.com.br
有人可以解释为什么吗?
答案 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的请求。效果很好。