Я пытаюсь войти на сайт через PHP cURL, и я получаю ответы «Bad Request».
Я играл с файлом hosts и устанавливал его на свой сервер, чтобы проверить, какие заголовки запросов отправляет мой браузер, и сравнить его с заголовками запросов, отправленными cURL.
Все равно, за исключением:
Браузер:
Content-Type: application/x-www-form-urlencoded Content-Length: 51
PHP cURL:
Content-Length: 51, 359 Content-Type: application/x-www-form-urlencoded; boundary=----------------------------5a377b7e6ba7
Я уже установил эти значения с помощью этой команды, но по-прежнему отправляет неправильные заголовки:
curl_setopt($this->hCurl, CURLOPT_HTTPHEADER, array( 'Expect:', 'Content-Type: application/x-www-form-urlencoded', 'Content-Length: 51' ));
Вам не нужно устанавливать длину контента самостоятельно. Если вы используете cURL для отправки HTTP POST, он рассчитает длину контента для вас.
Если вы установите значение CURLOPT_POSTFIELDS
в качестве массива, оно автоматически отправит запрос как multipart/form-data
и использует границу. Если вы передадите строку, она будет использовать application/x-www-form-urlencoded
поэтому убедитесь, что вы CURLOPT_POSTFIELDS
строку urlencoded в CURLOPT_POSTFIELDS
а не массив, так как вы хотите получить форму-urlencoded.
Вы должны это делать:
$data = 'name=' . urlencode($value) . '&name2=' . urlencode($value2); curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $data); // NOT $dataArray = array('name' => 'value', 'name2' => 'value2'); curl_setopt($this->hCurl, CURLOPT_POSTFIELDS, $dataArray);
В любом случае вам не нужно устанавливать длину содержимого, но вы должны использовать первый метод для получения кодировки application/x-www-form-urlencoded
в форме.
Если это не помогает, разместите весь код, относящийся к настройке запроса на завивание (все параметры и данные, которые вы передаете ему), и это должно помочь решить проблему.
РЕДАКТИРОВАТЬ:
Добавлен пример, который я придумал, что работает (я получил неудачный логин).
<?php $URL_HOME = 'http://ilocalis.com/'; $LOGIN_URL = 'https://ilocalis.com/login.php'; $ch = curl_init($URL_HOME); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $home = curl_exec($ch); //echo $home; $post = array('username' => 'drew', 'password' => 'testing 123'); $query = http_build_query($post); curl_setopt($ch, CURLOPT_URL, $LOGIN_URL); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $query); $login = curl_exec($ch); echo $login;