← Назад к вопросам

Что обозначают 300-ые коды ответов http?

1.6 Junior🔥 161 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# HTTP 3xx коды ответов (Редирект)

Общая сущность

3xx коды обозначают редирект — ресурс перемещён, и браузер или клиент должен сделать дополнительный запрос на новый адрес.

Основные 3xx коды

300 Multiple Choices

Этап: Редирект Значение: У ресурса несколько вариантов, клиент должен выбрать один Пример: Один документ доступен на разных языках

301 Moved Permanently (Постоянно перемещено)

Этап: Постоянный редирект Значение: Ресурс навсегда переместился на новый URL

Особенности:

  • Браузер запомнит новый адрес и будет идти туда напрямую
  • Поисковики обновят индекс (перенесут SEO вес)
  • GET запрос →GET на новый URL
  • POST запрос может быть проблема (изменение метода)

302 Found (Найдено / временный редирект)

Этап: Временный редирект Значение: Ресурс временно находится в другом месте

Особенности:

  • Браузер НЕ запомнит это (будет спрашивать снова)
  • Поисковики не обновят индекс
  • GET → GET на новый URL
  • POST → может быть проблема (изменение метода)

303 See Other (Посмотри в другом месте)

Этап: Редирект с изменением метода Значение: Смотри результат в другом месте (обычно через GET)

Особенности:

  • Гарантирует изменение POST на GET
  • Используется в POST-Redirect-GET паттерне

304 Not Modified (Не изменён)

Этап: Кэширование Значение: Твой кэш ещё актуален, используй его

Особенности:

  • БЕЗ тела ответа (значит экономим трафик!)
  • Клиент использует закэшированную версию
  • Проверяется через If-Modified-Since или ETag

307 Temporary Redirect (Временный редирект)

Этап: Временный редирект (безопасный) Значение: То же, что 302, но с гарантией сохранения метода

Особенности:

  • POST остаётся POST (не меняется на GET)
  • Временный (в отличие от 301)
  • Безопаснее 302 для POST запросов

308 Permanent Redirect (Постоянный редирект)

Этап: Постоянный редирект (безопасный) Значение: То же, что 301, но с гарантией сохранения метода

Особенности:

  • POST остаётся POST (не меняется на GET)
  • Постоянный (как 301)
  • Браузер запомнит и будет идти туда напрямую

Таблица сравнения 3xx кодов

КодНазваниеТипМетодКэшИспользование
300Multiple ChoicesВыборЛюбойНетРедко
301Moved PermanentlyПостоянныйGETДаМиграция сайта
302FoundВременныйGETНетВременное перемещение
303See OtherPOST→GETGETНетPOST-Redirect-GET
304Not ModifiedКэшN/AДаПроверка кэша
307Temporary RedirectВременныйСохранитьНетВременное перемещение (безопасное)
308Permanent RedirectПостоянныйСохранитьДаМиграция API (безопасная)

Практические примеры в Python

from fastapi import FastAPI, status, RedirectResponse

app = FastAPI()

# 301
@app.get("/old-docs")
async def old_docs():
    return RedirectResponse(
        url="/docs",
        status_code=status.HTTP_301_MOVED_PERMANENTLY
    )

# 302
@app.get("/temp-page")
async def temp_page():
    return RedirectResponse(
        url="/maintenance",
        status_code=status.HTTP_302_FOUND
    )

# 303 POST-Redirect-GET
@app.post("/create-user")
async def create_user(data: dict):
    user_id = "123"
    return RedirectResponse(
        url=f"/users/{user_id}",
        status_code=status.HTTP_303_SEE_OTHER
    )

Важные правила

  1. 301/308 для постоянных изменений — API версии, перемещение доменов
  2. 302/307 для временных — техническое обслуживание, балансировка
  3. 303 после POST — POST-Redirect-GET паттерн
  4. 304 для оптимизации — кэширование и ETag

Вывод

3xx коды управляют редиректами. Правильное использование улучшит SEO и предотвратит потерю данных при POST.