Это даст мне код «301 Moved Permanentently» с HTTP 1.1 и 1.0.
HTTP status code 301 является перенаправление на новый URL:
Запрошенный ресурс был назначен новый постоянный URI, и любые будущие ссылки на этот ресурс следует использовать один из возвращенных URI. Клиенты с возможностями редактирования ссылок должны автоматически перенаправить ссылки на Request-URI на одну или несколько новых ссылок, возвращаемых сервером, где это возможно. Этот ответ можно кэшировать, если не указано иное.
Новый постоянный URI ДОЛЖЕН быть предоставлен полем «Место» в ответе. Если метод запроса не был ГОЛОВКОЙ, объект ответа СЛЕДУЕТ содержать короткую гипертекстовую ноту с гиперссылкой на новый URI (ы).
Если код статуса 301 получен в ответ на запрос, отличный от GET или HEAD, пользовательский агент НЕ ДОЛЖЕН автоматически перенаправлять запрос, если он не может быть подтвержден пользователем, поскольку это может изменить условия, при которых запрос было выпущено.
Примечание: при автоматическом перенаправлении запроса POST после получения кода состояния 301 некоторые существующие пользовательские агенты HTTP/1.0 будут ошибочно изменять его в запрос GET.
На сервере сообщается, что URL-адрес отправленного вами запроса GET
к состоянию на настоящий момент недействителен. Вам нужно извлечь значение заголовка Location
из ответа сервера, а затем повторить тот же запрос к указанному URL.
Это даст мне «HTTP/1.1 400 Bad Request» для HTTP 1.1 и «HTTP/1.1 200 OK» для HTTP 1.0.
Почему у такого поведения? Это происходит потому, что у нас есть запрос в HTTP 1.0, а ответ - в HTTP 1.1?
Host
заголовка в HTTP 1.0 опционально, но требуется в HTTP 1.1:
Клиент ДОЛЖЕН содержать поле заголовка хоста во всех сообщениях запроса HTTP/1.1. Если запрошенный URI не содержит имя хоста Интернета для запрашиваемой услуги, поле заголовка хоста ДОЛЖНО указываться с пустым значением. Прокси-сервер HTTP/1.1 ДОЛЖЕН гарантировать, что любое сообщение запроса, которое оно отправляет, содержит соответствующее поле заголовка хоста, которое идентифицирует запрос, запрашиваемый прокси-сервером. Все интернет-серверы HTTP/1.1 ДОЛЖНЫ отвечать с кодом состояния 400 (Bad Request) на любое сообщение с запросом HTTP/1.1, которому не хватает поля заголовка хоста.
Итак, если вы не вставить дополнительную пустую строку, вы в конечном итоге отправки этих запросов отдельно:
GET /path HTTP/1.0
Host: hostname
GET /path HTTP/1.1
Host: hostname
которые оба действительны.
Но, когда вы вставляете дополнительную пустую строку, вы на самом деле отправки двух отдельных запросов в одно время:
GET /path HTTP/1.x;
Host: hostname
заголовки запроса и тело запроса разделены пробелом строка, а запрос GET
не имеет тела запроса, поэтому первая пустая строка завершает запрос.
Итак, в этом случае первый запрос действителен только для HTTP 1.0 и является недопустимым для HTTP 1.1, поскольку отсутствует заголовок Host
. Второй запрос просто недействителен в обеих версиях.
Спасибо, теперь это имеет больше смысла. Я просто добавил несколько строк, чтобы проверить ответ с сервера и извлечь новое местоположение. Он отлично работает. Очень ценю вашу помощь, я не могу проголосовать за это, так как у меня недостаточно репутации :( – hvuong91