Curl имеет функцию для ручного указания IP-адреса для разрешения хоста. Например:
curl https://www.google.com --resolve "www.google.com:443:173.194.72.112"
Это особенно полезно при использовании HTTPS. Если бы это был просто HTTP-запрос, я мог бы достичь этого, указав непосредственно IP-адрес и добавив заголовок узла. Но в HTTPS, который нарушит соединение, поскольку хост SSL-сертификата будет сравниваться с IP-адресом, а не с заголовком хоста.
Мой вопрос: как я могу сделать то же самое в PHP?
В соответствии с изменением , поддержка CURLOPT_RESOLVE
была добавлена в 5.5.0.
Обратите внимание, что на момент написания документа еще не документировано, но в соответствии с этим сообщением об ошибке он принимает массив как аргумент.
Хотя ответ @ deceze верен, живой пример может оказаться полезным. Мне нужен CURLOPT_RESOLVE
потому что я пытался напрямую подключиться к IP-адресу с дополнительным заголовком Host: www.example.com
, но поскольку сервер использовал SNI, это не сработало.
Я использовал CURLOPT_RESOLVE
для решения моей проблемы. Этот код позволяет мне подключаться к серверу SNI по IP-адресу по моему выбору:
$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);