Мой запрос cURL смущает некоторые серверы? - PullRequest
1 голос
/ 05 марта 2012

Я делаю запрос на публикацию cURL с помощью следующего скрипта, который публикует скрипт обработки формы:

$url = "http://www.example.com/process_script.php";
$referer = "http://www.example.com";
$agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11";
$postdata = array('message' => 'Hello, World!', 'name' => 'Bob');

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_exec($ch);

Он отлично работает на некоторых URL.Кроме того, когда я публикую его в своем тестовом скрипте (который просто выводит реферер, агент и постданные), он работает просто отлично.

Однако некоторые серверы выдают мне эту причудливую ошибку "Сервер не может понять ваш запрос", хотя,Это не 403, потому что когда я удаляю опцию пользовательского агента, я получаю 403. Что-то не так со строкой пользовательского агента?Он извлекается непосредственно из моего реального браузера.

Есть ли дополнительные параметры, которые необходимо настроить для эмуляции реального браузера?

1 Ответ

2 голосов
/ 05 марта 2012

Я не уверен, но попробуйте вместо этого:

$postdata = array('message' => 'Hello, World!', 'name' => 'Bob');
$postdata = http_build_query($postdata);

Причина этого заключается в том, что если вы публикуете форму с использованием строки в кодировке URL, возвращенной http_build_query () , то форма публикуется с использованием энктипа application/x-www-form-urlencoded. Когда вы используете массив, это приводит к multipart/form-data.

Возможно, некоторые формы ожидают данные urlencoded и не понимают (или отказываются обрабатывать) формы, отправленные в кодировке multipart/form-data.

О CURLOPT_POSTFIELDS:

Этот параметр может быть передан как строка в кодировке, например 'para1 = val1 & para2 = val2 & ...' или в виде массива с именем поля в качестве ключа и полевые данные в качестве значения. Если значение является массивом, заголовок Content-Type будет установлено значение multipart / form-data .
Источник: curl_setopt ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...