Какая разница между перенаправлением 302 и 307?

Какая разница между ответом 302 FOUND и 307 TEMPORARY REDIRECT HTTP?

Спецификация W3, по-видимому, указывает, что они оба используются для временных переадресаций, и ни один из них не может быть кэширован, если только этот ответ не позволяет это сделать.

Ответ 1

Разница касается перенаправления запросов POST, PUT и DELETE и ожиданий сервера для поведения пользовательского агента (RFC 2616):

Примечание. RFC 1945 и RFC 2068 указывают, что клиенту не разрешено изменить метод на перенаправленный запрос. Однако большинство существующих пользователей реализация агента обрабатывает 302, как будто это был ответ 303, выполняющий ПОЛУЧИТЬ значение поля Location независимо от исходного запроса метод. Коды состояния 303 и 307 были добавлены для серверов, которые желают однозначно определить, какой вид реакции ожидается от клиент.

Также читайте статью в Википедии о 30x кодах перенаправления.

Ответ 2

307 возникло из-за того, что пользовательские агенты, принятые как де-факто поведение, принимают запросы POST, которые получают ответ 302 и отправляют запрос GET в заголовок ответа местоположения.

Это неверное поведение — только 303 должно заставить POST превратиться в GET. Пользовательские агенты должны (но не должны) придерживаться метода POST при запросе нового URL-адреса, если исходный запрос POST возвратил 302.

307 было введено, чтобы позволить серверам сообщать пользовательскому агенту, что изменение метода не должно производиться клиентом при выполнении заголовка ответа местоположения.

Ответ 3

Хорошим примером действия 307 Internal Redirect является то, что Google Chrome встречается с HTTP-вызовом в домене, который, как он знает, требует Strict Transport Security.

Браузер перенаправляется плавно, используя тот же метод, что и исходный вызов.

HTST 307 Internal Redirect

Ответ 4

ОЖИДАЕТСЯ за 302: перенаправление использует тот же метод запроса POST на NEW_URL

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT POST NEW_URL

ACTUAL для 302, 303: перенаправить метод запроса изменений из POST для получения на NEW_URL

CLIENT POST OLD_URL -> SERVER 302 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)
CLIENT POST OLD_URL -> SERVER 303 NEW_URL -> CLIENT GET NEW_URL (redirect uses GET)

ACTUAL для 307: перенаправление использует тот же метод запроса POST на NEW_URL

CLIENT POST OLD_URL -> SERVER 307 NEW_URL -> CLIENT POST NEW_URL

Ответ 5

Flowchart

  • 301: постоянное перенаправление: URL устарел и его следует заменить. Браузеры будут кешировать это.
    Пример использования: URL перемещен с /register-form.html на signup-form.html.
    Метод изменится на GET в соответствии с RFC 7231: "По историческим причинам пользовательский агент МОЖЕТ изменить метод запроса с POST на GET для последующего запроса".
  • 302: временное перенаправление. Используйте только для клиентов HTTP/1.0. Этот код состояния не должен изменять метод, но браузеры все равно сделали это. В RFC говорится: "Многие пользовательские агенты до HTTP/1.1 не понимают [303]. Когда взаимодействие с такими клиентами является проблемой, вместо этого можно использовать код состояния 302, так как большинство пользовательских агентов реагируют на ответ 302, как описано здесь. за 303. " Конечно, некоторые клиенты могут реализовать его в соответствии со спецификацией, поэтому, если совместимость с такими древними клиентами не является реальной проблемой, 303 лучше для стабильных результатов.
  • 303: временное перенаправление, изменение метода на GET.
    Пример использования: если браузер отправил POST на /register.php, то теперь загрузите (GET) /success.html.
  • 307: временное перенаправление, идентичное повторение запроса.
    Пример использования: если браузер отправил POST на /register.php, то это говорит ему, чтобы повторить POST на /signup.php.
  • 308: постоянное перенаправление, идентичное повторение запроса. Где 307 - это аналог "без изменения метода" 303, этот статус 308 - это аналог "без изменения метода" 301.

RFC 7231 (с 2014 года) очень читабелен и не слишком многословен. Если вы хотите знать точный ответ, рекомендуем прочитать. В некоторых других ответах используется RFC 2616 от 1999 года, но ничего не изменилось.

RFC 7238 определяет статус 308. Он считается экспериментальным, но он уже поддерживается всеми основными браузерами в 2016 году.

Ответ 6

Кроме того, для администраторов серверов важно отметить, что браузеры могут предлагать пользователю запрос, если вы используете перенаправление 307.

Например, *, Firefox и Opera запрашивают у пользователя разрешение на перенаправление, тогда как Chrome, IE и Safari будут делать трансляцию прозрачно.

* per Bulletproof SSL и TLS (страница 192).

Ответ 7

В некоторых случаях злоумышленник может злоупотреблять перенаправлениями 307 для изучения учетных данных жертвы.

Дополнительную информацию можно найти в разделе 3.1 of Комплексного формального анализа безопасности OAuth 2.0.

Авторы вышеупомянутой статьи предлагают следующее:

Fix. В отличие от текущей формулировки в стандарте OAuth, точный метод перенаправления не является деталью реализации, но необходим для безопасности OAuth. В стандарте HTTP (RFC 7231) только перенаправление 303 определено однозначно, чтобы отбрасывать тело запроса HTTP POST. Все остальные коды состояния перенаправления HTTP, включая наиболее часто используемый 302, оставляют браузеру возможность сохранить запрос POST и данные формы. На практике браузеры обычно переписывают запрос GET, тем самым отбрасывая данные формы, за исключением 307 перенаправлений. Поэтому стандарт OAuth должен требовать 303 перенаправления для шагов, упомянутых выше, чтобы решить эту проблему.

Ответ 8

| Response               | What browsers should do   | What browsers actually do |
|------------------------|---------------------------|---------------------------|
| 302 Found              | Redo request with new url | GET with new url          |
| 303 See Other          | GET with new url          | GET with new url          |
| 307 Temporary Redirect | Redo request with new url | Redo request with new url |

Все браузеры ошиблись 302. Итак, 303 и 307 были созданы.

╔═══════════╤════════════════════════════════════════════════╗
║           │                Switch to GET?                  ║
║ Temporary │          No            │         Yes           ║
╠═══════════╪════════════════════════╪═══════════════════════╣
║ No        │ 308 Permanent Redirect │ 301 Moved Permanently ║
╟───────────┼────────────────────────┼───────────────────────╢
║ Yes       │ 307 Temporary Redirect │ 303 See Other         ║
║           │ 302 Found (intended)   │ 302 Found (actual)    ║
╚═══════════╧════════════════════════╧═══════════════════════╝