cURL возвращает 302, а браузер возвращает 200

У меня есть скрипт, который использует загрузку cURL для входа на сайт и отправки ряда форм, однако недавно он перестал работать из-за того, что запросы cURL возвращают 302s и перенаправляют на страницу блока / конечной точки. Если я делаю те же действия с браузером, у меня нет перенаправлений, только 200 OK.

Мой cURL использует cookie, возвращаемый процессом входа в систему, поэтому я не думаю, что сеанс удаляется.

Первоначально я думал, что токен CSRF (какого-то рода) отсутствует, учитывая местоположение перенаправления, и что более поздние формы в процессе (с использованием браузера) содержат скрытое поле токена CSRF, но URL-адрес не требует опубликованных данных.

CURL и ответ следующие:

curl_setopt($ch, CURLOPT_URL, 'https://*******.********.co.uk/Dispatcher?menuid=pos_home');
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, 0);
$content = curl_exec ($ch);
echo "CURL INFO : <BR/><pre>" ;
print_r(curl_getinfo($ch));

который возвращает:

Array
(
[url] => https://*******.********.co.uk/Dispatcher?menuid=pos_home
[content_type] => text/html
[http_code] => 302
[header_size] => 253
[request_size] => 332
[filetime] => -1
[ssl_verify_result] => 20
[redirect_count] => 0
[total_time] => 0.142718
[namelookup_time] => 2.4E-5
[connect_time] => 2.4E-5
[pretransfer_time] => 9.0E-5
[size_upload] => 43
[size_download] => 327
[speed_download] => 2291
[speed_upload] => 301
[download_content_length] => -1
[upload_content_length] => 43
[starttransfer_time] => 0.142659
[redirect_time] => 0
[certinfo] => Array
(
)

[primary_ip] => nnn.nnn.nnn.nn
[primary_port] => 443
[local_ip] => nnn.nnn.nnn.nn
[local_port] => 53154
[redirect_url] => https://*******.********.co.uk/Dispatcher?menuid=badorMissingCSRFT

)

Если у кого-то есть идеи, почему или как сервер может дать другой ответ для cURL на запрос браузера, я был бы очень признателен — спасибо.

3

Решение

Вам необходимо следовать перенаправлению:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

Другие причины не следовать перенаправлению:

4.14 Перенаправляет работу в браузере, но не с curl!

curl прекрасно поддерживает перенаправления HTTP (см. пункт 3.8). Браузеры обычно поддерживают, по крайней мере, два других способа выполнения перенаправлений, которых нет в curl:

Мета-теги. Вы можете написать HTML-тег, который заставит браузер перенаправить на другой данный URL-адрес через определенное время.

Javascript. Вы можете написать программу Javascript, встроенную в HTML-страницу, которая перенаправляет браузер на другой заданный URL-адрес.

Невозможно заставить curl следовать этим перенаправлениям. Вы должны либо вручную выяснить, для чего предназначена страница, либо написать скрипт, который анализирует результаты и выбирает новый URL.

источник: http://curl.haxx.se/docs/faq.html#Redirects_work_in_browser_but_no

2

Другие решения

Может быть, сервер начал проверять User-Agent: или Referer: Заголовки HTTP.

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

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

0

свернуться с опцией -L или —location, чтобы следовать перенаправлению.

curl -L google.com

0
По вопросам рекламы [email protected]