Нашел один интересный сайт
https://www.b2b-energo.ru/
(может есть и другие похожие, но мне попался этот), захотел скачать его с помощью curl и наткнулся на очень интересную особенность.
Я пытался скачивать заглавную страницу сайта, поэтому куки и прочая персональная информация здесь не принципиальна.
Если я открываю эту страницу в браузере, то браузер делает несколько редиректов и затем отображает страницу.
Для более точной проверки я запустил wireshark и сделал захват пакетов при запросе страницы в браузере.
Начало работы выглядит так:
192.168.0.156 91.206.127.244 HTTP 543 GET / HTTP/1.1
91.206.127.244 192.168.0.156 HTTP 684 HTTP/1.1 307 Temporary Redirect (text/html)
...
тут следует несколько редиректов, пока в конце-концов не возвращается страница
...
91.206.127.244 192.168.0.156 HTTP 595 HTTP/1.1 200 OK (text/html)
Но если я пытаюсь скачать эту же страницу через curl
curl -v https://www.b2b-energo.ru/
То на запрос мне сразу же приходит ответ 200 с какой-то непонятной страницей.
Я, конечно, добавлял в вызову curl стандартные заголовки, которые отправляет бразузер, но дело это не меняло.
Я перепробовал все популярные браузеры, они все работают одинаково.
Для ручных запросов использвал curl, postman, прямую запись в сокет байтов запроса.
Но в браузерах всегда был редирект, а в других утилитах всегда возвращается сразу страница.
Т.к. у меня есть wireshark, то я взял побайтный дамп пакета, который отправляет браузер и с помощью python напрямую отправил эти данные в сокет. Т.е. я с точностью до байта отправил то, что отправляет браузер. Но даже в этом случае при дословном воспроизведении запроса мне возвращался ответ 200, а не 307.
При ручной отправке порядок пакетов такой.
192.168.0.156 91.206.127.244 HTTP 543 GET / HTTP/1.1
91.206.127.244 192.168.0.156 HTTP 833 HTTP/1.1 200 OK (text/html)
Т.е. на запрос - ответ сразу 200.
Как видно размер запроса одинаковый т.к. это копия запроса от браузера, а размер ответа совершенно другой хотя это должна быть стандартная заглавная страница.
Закрадывается идея, что сервер принимает во внимание не только данные запроса, но что-то еще.
Хочется узнать почему сервер на один и тот же запрос (с точностью до байта) при отправке из браузера делает редирект, а при ручной отправке запроса возвращает какую-то страницу?
На основании чего он принимает решения? Хочется понять что еще может влиять на сервер?
А может только у меня так странно работает?
Я раньше думал, что на одинаковые запросы будут одинаковые ответы, но в некоторых случаях похоже получается иначе.