Ошибка cuRL returnin 404

Я использую cuRL для получения данных с удаленного сервера... Ответ в формате JSON.. Это мой код:

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
curl_setopt($ch, CURLOPT_URL, 'http://www.myaddress.com/mypage.php');
curl_setopt($ch, CURLOPT_POSTFIELDS, array("id" => $id));
$return = curl_exec($ch);
curl_close($ch);

Если я получаю доступ к ссылке в браузере, страница загружается в порядке, но если я получаю доступ через cuRL, возвращаем ошибку 404...

Ответ 1

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

1) Как указано в других ответах, обязательно установите все необходимые заголовки, вы можете их проверить, например. Firebug, как показано здесь, http://s30.postimg.org/qjcbmdye9/facebook_headers.png

или вы можете получить заголовки с помощью функции php get_headers. для его установки используйте

curl_setopt($ch, CURLOPT_HTTPHEADER, array("HeaderName: HeaderValue"));

2). Когда вы открываете страницу в браузере (исключая отправку формы с помощью метода post), он делает запрос на получение вместо сообщения, поэтому, если на стороне сервера он проверяется $_GET, то ваш почтовый запрос не будет рассмотрен.

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

4), если вы отправляете форму, обязательно установите кнопку отправки с ее именем и значением, так как это похоже на скрытые поля, это также можно проверить.

5) Куки файлы также могут быть проблемой, потому что по умолчанию браузер имеет его, а завиток нет. Чтобы иметь возможность устанавливать и читать файлы cookie, используйте этот код

// set cookie 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

// use cookie
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

здесь, $cookie_file путь к файлу файлов cookie. Не знаю в linux или mac, но в окнах обязательно используйте абсолютный путь к файлу cookie.

6) Кроме того, вы можете установить референт на

curl_setopt($ch, CURLOPT_REFERER, 'http://www.myaddress.com/mypage.php');

EDIT:. В случае запроса ajax вы можете добавить заголовок X-Requested-With со значением как XMLHttpRequest

Ответ 2

Возможно, сервер проверяет HTTP-заголовок, это дело в большинстве случаев.

Итак, добавьте тот же HTTP-заголовок вашего браузера, подтвердите с помощью Firebug:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('SomeName: SomeValue'));

Ответ 3

Вероятно, что-то еще браузер посылает ваш код cURL. Вы можете использовать любой из инструментов, предложенных другими людьми, Firebug, Wireshark, Fiddler и т.д. И т.д.

Что вам нужно сделать, так это добавить недостающие фрагменты в свой запрос, чтобы максимально приблизить браузер к запросу cURL, пока удаленная страница не ответит на 200.

Я замечаю, что вы делаете POST. Во многих случаях, что происходит с вашим браузером, вы посещаете страницу с запросом GET. Сеанс инициализируется на удаленном сайте, и файл cookie сохраняется в вашем браузере с идентификатором сеанса.

Затем этот файл cookie должен быть отправлен вместе с последующими запросами POST. PHP cURL имеет много вариантов поддержки файлов cookie. Могут быть другие требования, такие как токены CSRF и т.д.

Опять же, обратная инженерия - это ключ.