Ошибка 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) Как указано в других ответах, обязательно установите все необходимые заголовки, вы можете проверить их, например, firebug, как показано здесь, http://img.ruphp.com/php/facebook_headers.png

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

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

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

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

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

5) Cookies также могут быть проблемой, потому что по умолчанию браузер имеет его, а завиток нет. Чтобы иметь возможность устанавливать и читать файлы 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

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

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

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

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

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

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

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

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