如何在PHP中手动解析HTTP(S)连接中的主机

Gre*_*ire 5 php https

Curl具有手动指定要将主机解析到的IP的功能.例如:

curl https://www.google.com --resolve "www.google.com:443:173.194.72.112"
Run Code Online (Sandbox Code Playgroud)

这在使用HTTPS时特别有用.如果它只是一个HTTP请求,我可以通过直接指定IP地址并添加主机头来实现相同的目的.但是在HTTPS中会破坏连接,因为SSL证书主机将与IP地址而不是主机头进行比较.

我的问题是,我怎样才能在PHP中做同样的事情?

Luc*_*oed 6

虽然@ deceze的答案是正确的,但实际的例子可能会有用.我需要CURLOPT_RESOLVE因为我试图通过额外的Host: www.example.com标头直接连接到IP地址,但由于服务器使用SNI,这不起作用.

我曾经CURLOPT_RESOLVE解决过我的问题.此代码允许我使用我选择的IP地址连接到SNI服务器:

$resolve = array(sprintf(
    "%s:%d:%s", 
    $hostname,
    $port,
    $host_ip
));

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RESOLVE, $resolve);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$result = curl_exec($ch); 
curl_close($ch);
Run Code Online (Sandbox Code Playgroud)


dec*_*eze 4

根据变更日志CURLOPT_RESOLVE, 5.5.0 中添加了对的支持。
请注意,在撰写本文时,它甚至还没有记录,但根据此错误报告,它需要一个数组作为参数。