Моята cURL заявка обърква някои сървъри?

Правя заявка за публикуване на 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. Има ли нещо нередно с низа на потребителския агент? Изтеглено е директно от действителния ми браузър.

Има ли още опции, които трябва да настроя, за да емулирам истински браузър?


person Joey    schedule 04.03.2012    source източник
comment
Ако наистина сте цитирали съобщението такова, каквото е, това е вътрешна грешка на сървъра. Бих предложил първо да проверите вашите параметри: може би те трябва да бъдат именувани с главни букви или нещо подобно. )   -  person raina77ow    schedule 05.03.2012


Отговори (1)


Не съм сигурен, но вместо това опитайте това:

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

Причината да направите това е, че ако публикувате формуляра, като използвате URL-кодирания низ, върнат от http://php.net/http_build_query, формулярът се публикува с помощта на enctype application/x-www-form-urlencoded. Когато използвате масив, това води до multipart/form-data.

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

Относно CURLOPT_POSTFIELDS:

Този параметър може или да бъде предаден като urlencoded низ като 'para1=val1¶2=val2&...' или като масив с името на полето като ключ и данните на полето като стойност . Ако стойността е масив, заглавката Content-Type ще бъде зададена на multipart/form-data.< br> Източник: curl_setopt()

person drew010    schedule 04.03.2012
comment
Отлично, винаги използвам urlencoded низ, освен ако не трябва да публикувам файл или нещо подобно; тогава използването на масив е по-лесно. Радвам се, че това беше. - person drew010; 05.03.2012