我们的合作伙伴已将我们的服务器IP列入白名单,因此我们可以向他们发送带有新客户数据的cURL请求,但他们的CRM返回Error: IP address of a connected platform is not allowed
可能是因为标头包含CloudFlare IP而不是我们要求的服务器的真实IP白名单中。
有没有办法通过cURL请求显示我们的真实服务器IP?
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://clients.domain.com/api');
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($curl);
return $res;
试了这个没有成功:
curl_setopt($curl, CURLOPT_HEADER, FALSE);
curl_setopt($curl, CURLOPT_INTERFACE, '1.1.1.1');
和
curl_setopt($curl, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: 1.1.1.1, HTTP_X_FORWARDED_FOR: 1.1.1.1"));
编辑:他们的日志显示的是IPv6 IP而不是IPv4服务器IP,它看起来像这样:2a02:7aa0:1201::xxxx:xxxx
经过一些调查后,看来这个IPv6 IP由托管公司托管,并且在白名单之后一切都开始工作了。
有什么想法为什么cURL发出一些奇怪的IPv6而不是真正的服务器IPv4?
答案 0 :(得分:0)
是的,如果clients.domain.com
通过CF的代理,那么你可以直接连接到服务器,可能只是伪造主机头。从PHP 7.0.7开始,这可以作为
curl_setopt_array($ch,array(
CURLOPT_URL=>'http://clients.domain.com/api',//to set the host
CURLOPT_CONNECT_TO=>'::8.8.8.8:80'
));
- 如果您使用httpS
:80
替换为:443
并将8.8.8.8
替换为真实服务器的IP(不是cloudflare IP)
或者如果您还没有使用PHP 7.0.7+,那么在旧版本中,您可以
curl_setopt_array($ch,array(
CURLOPT_URL=>'http://8.8.8.8/api',
CURLOPT_HTTPHEADER=>array('Host: clients.domain.com')
));
(再次,将8.8.8.8
替换为真实服务器的IP,而不是cloudflare IP)
手动设置主机头。我不确定它是否可以正常使用http位置重定向和CURLOPT_FOLLOWLOCATION,因此您可能必须手动处理位置http重定向