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' 
));

Ответ 1

Вам не нужно устанавливать длину контента самостоятельно. Если вы используете cURL для отправки HTTP POST, он рассчитает длину контента для вас.

Если вы установите значение CURLOPT_POSTFIELDS в качестве массива, оно автоматически отправит запрос как multipart/form-data и использует границу. Если вы передадите строку, она будет использовать application/x-www-form-urlencoded, поэтому убедитесь, что вы передали строку с 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 кодировки в форме.

Если это не помогает, разместите весь код, относящийся к настройке запроса на завивание (все параметры и данные, которые вы передаете ему), и это должно помочь решить проблему.

EDIT:

Добавлен пример, который я придумал, что работает (я получил неудачный вход в систему).

<?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;