PHP cURL Content-Length и Content-Type неправильные

Я пытаюсь войти на сайт через 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;