В чем разница между ответом a 302 FOUND
и 307 TEMPORARY REDIRECT
HTTP?
Спецификация W3, кажется, указывает, что они оба используются для временных перенаправлений, и ни один из них не может быть кэширован, если ответ специально не разрешает это.
В чем разница между ответом a 302 FOUND
и 307 TEMPORARY REDIRECT
HTTP?
Спецификация W3, кажется, указывает, что они оба используются для временных перенаправлений, и ни один из них не может быть кэширован, если ответ специально не разрешает это.
Разностные касается переадресации POST
, PUT
и DELETE
запросов , и какие ожидания сервера являются для поведения агента пользователя ( RFC 2616
):
Примечание: RFC 1945 и RFC 2068 указывают, что клиенту не разрешено изменять метод в перенаправленном запросе. Однако большинство существующих реализаций пользовательского агента обрабатывают 302 так, как если бы это был ответ 303, выполняя GET для значения поля Location независимо от исходного метода запроса. Коды состояния 303 и 307 были добавлены для серверов, которые хотят однозначно прояснить, какой тип реакции ожидается от клиента.
Также читайте статью в Википедии о кодах перенаправления 30x .
307 появился потому, что пользовательские агенты приняли де-факто поведение, чтобы принимать запросы POST, которые получают ответ 302 и отправляют запрос GET в заголовок ответа Location.
Это неправильное поведение - только 303 должен заставить POST превратиться в GET. Пользовательские агенты должны (но не) придерживаться метода POST при запросе нового URL, если исходный запрос POST возвратил 302.
307 был введен для того, чтобы серверы давали понять агенту пользователя, что изменение метода не должно выполняться клиентом при следовании заголовку ответа Location.
источник
302
неправильно. Chrome 30, IE10. Это стало де-факто неправильной реализацией; это не может быть изменено, потому что многие сайты ошибочно выдают ошибку 302. На самом деле ASP.net MVC неправильно выдает ошибку 302, в зависимости от того, что браузеры обрабатывают ее неправильно.303
она также была введена307
в спецификации HTTP 1.1 и поэтому обеспечивает обратную совместимость с пользовательскими агентами HTTP 1.0. Конечно, реальный вопрос в том, должны ли мы по-прежнему обрабатывать пользовательские агенты HTTP 1.0 вообще?Response.RedirectSeeOther
), а если клиент не 1.1 (напримерGET /foo.html
,GET /foo.html HTTP/1.0
), то выпустить наследие302
.Хорошим примером
307 Internal Redirect
действия является случай, когда Google Chrome обнаруживает HTTP-вызов домена, который, как он знает, требует строгой транспортной безопасности.Браузер перенаправляет без проблем, используя тот же метод, что и исходный вызов.
источник
Пример использования: URL перемещен из
/register-form.html
вsignup-form.html
.Метод изменится на GET в соответствии с RFC 7231: «По историческим причинам пользовательский агент МОЖЕТ изменить метод запроса с POST на GET для последующего запроса».
Пример использования: если браузер отправил POST
/register.php
, затем загрузите (GET)/success.html
.Пример использования: если браузер отправил POST в
/register.php
, то это говорит ему повторить POST в/signup.php
.RFC 7231 (с 2014 года) очень читабелен и не слишком многословен. Если вы хотите знать точный ответ, рекомендуем прочитать. Некоторые другие ответы используют RFC 2616 от 1999 года, но ничего не изменилось.
RFC 7238 определяет статус 308. Он считается экспериментальным, но он уже был поддержан всеми основными браузерами в 2016 году.
источник
ОЖИДАЕТСЯ для 302: перенаправление использует тот же метод запроса POST для NEW_URL
ACTUAL для 302, 303: метод запроса перенаправления изменений с POST на GET для NEW_URL
ACTUAL для 307: редирект использует тот же метод запроса POST для NEW_URL
источник
302 - это временное перенаправление, которое генерируется сервером, тогда как 307 - это внутренний ответ на перенаправление, генерируемый браузером. Внутреннее перенаправление означает, что перенаправление выполняется автоматически внутренним браузером, в основном браузер самостоятельно изменяет введенный URL-адрес с http на https в запросе get перед тем, как сделать запрос, поэтому запрос на незащищенное соединение никогда не выполняется в Интернете. Будет ли браузер изменять URL-адрес на https или нет, зависит от списка предварительной загрузки hsts, который поставляется с предустановленным браузером. Вы также можете добавить любой сайт, поддерживающий https, в список, введя домен в список предварительной загрузки hsts вашего браузера, который находится на chrome: //net-internals/#hsts. Еще одна вещь, которую доменные сайты могут добавлять владельцы предварительно загрузить список, заполнив форму на https://hstspreload.org/так что он предустанавливается в браузерах для каждого пользователя, хотя я упоминаю, что вы можете сделать это специально для себя.
Позвольте мне объяснить на примере:
я сделал запрос на получение http://www.pentesteracademy.com, который поддерживает только https, и у меня нет этого домена в моем списке предварительной загрузки hsts в моем браузере, так как владелец сайта не зарегистрировался для него прийти с предустановленным списком предзагрузки hsts. Запрос GET на незащищенную версию сайта перенаправляется на безопасную версию (см. Заголовок http с указанием местоположения для этого в ответе на изображении выше). Теперь я добавляю сайт в свой собственный список предварительной загрузки браузера, добавляя его домен в форме Добавить домен hsts в chrome: // net-internals / # hsts, которая изменяет мой личный список предварительной загрузки в моем браузере Chrome. Обязательно выбирайте для включения субдомены для Вариант СТС есть. Давайте теперь посмотрим запрос и ответ для того же веб-сайта после добавления его в список предварительной загрузки hsts.
вы можете увидеть внутреннее перенаправление 307 там в заголовках ответов, фактически этот ответ генерируется вашим браузером, а не сервером.
Кроме того, список предварительной загрузки HSTS может помочь предотвратить доступ пользователей к небезопасной версии сайта, поскольку перенаправление 302 подвержено быстрым атакам.
Надеюсь, я немного помог вам понять больше о перенаправлениях.
источник
Изначально был просто
302
Идея в том, что:
GET
в каком-то месте, вы бы перенаправилиGET
на новый URLPOST
в каком-то месте, вы бы перенаправилиPOST
на новый URLPUT
в каком-то месте, вы бы перенаправилиPUT
на новый URLDELETE
в каком-то месте, вы бы перенаправилиDELETE
на новый URLК сожалению, каждый браузер сделал это неправильно. Получая a
302
, они всегда переключаютсяGET
на новый URL, а не повторяют запрос с одним и тем же глаголом ( например ,POST
):Это стало де-факто неправильно.
Все браузеры
302
ошиблись. Так303
и307
были созданы.| Ответ | Что должны делать браузеры | Что на самом деле делают браузеры | | ------------------------ | ------------------------ --- | --------------------------- | | 302 найдено | Повторить запрос с новым URL | ПОЛУЧИТЬ с новым URL | | 303 См. Другое | ПОЛУЧИТЬ с новым URL | ПОЛУЧИТЬ с новым URL | | 307 Временный редирект | Повторить запрос с новым URL | Повторить запрос с новым URL |
В форме диаграммы
5 различных видов перенаправлений:
В качестве альтернативы:
источник
Кроме того, для администраторов сервера может быть важно отметить, что браузеры могут отображать подсказку для пользователя, если вы используете перенаправление 307.
Например *, Firefox и Opera будут запрашивать у пользователя разрешение на перенаправление, тогда как Chrome, IE и Safari будут выполнять перенаправление прозрачно.
* за пуленепробиваемые SSL и TLS (стр. 192).
источник
В некоторых случаях злоумышленник может злоупотреблять перенаправлениями 307, чтобы узнать учетные данные жертвы.
Дополнительную информацию можно найти в разделе 3.1 из универсальной формальной анализа безопасности OAuth 2.0 .
Авторы вышеупомянутой статьи предлагают следующее:
источник