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

Что такое 301 статус ответа сервера?

2.0 Middle🔥 131 комментариев
#DevOps и инфраструктура#Django

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

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

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

Что такое 301 статус ответа сервера

301 Moved Permanently — это HTTP статус код, который означает, что ресурс постоянно переместился на новый URL. Сервер сообщает клиенту (браузеру или приложению), что текущий адрес больше не используется, и все будущие запросы должны идти на новый адрес.

Основные характеристики

301 Moved Permanently:

  • Редирект постоянный — кэшируется браузерами и поисковиками
  • Метод запроса может измениться: POSTGET (хотя стандарт говорит сохранять метод)
  • Поисковики обновляют индекс и передают ранг старого URL на новый
  • Используется, когда URL навсегда устаревает

Структура ответа

from flask import Flask, redirect

app = Flask(__name__)

@app.route('/old-page')
def old_page():
    # 301 редирект на новый URL
    return redirect('/new-page', code=301)

@app.route('/new-page')
def new_page():
    return 'Это новая страница'

# HTTP ответ:
# HTTP/1.1 301 Moved Permanently
# Location: /new-page
# Content-Length: 0

Примеры использования

1. Переименование страницы:

# Старый URL больше не используется
/blog/old-article-name → /blog/new-article-name

2. Переезд на новый домен:

# Все страницы старого сайта перемещены на новый домен
http://old-site.com → https://new-site.com

3. Удаление www:

http://www.example.com → https://example.com

FastAPI пример

from fastapi import FastAPI
from fastapi.responses import RedirectResponse

app = FastAPI()

@app.get('/old-endpoint')
async def old_endpoint():
    return RedirectResponse(url='/new-endpoint', status_code=301)

@app.get('/new-endpoint')
async def new_endpoint():
    return {'message': 'Это новый endpoint'}

301 vs 302 vs 307

301 Moved Permanently (постоянный):

# Кэшируется браузером
# Поисковики обновляют ссылки
# Бесплатно переносит SEO вес старого URL
return redirect('/new-url', code=301)

302 Found (временный):

# Не кэшируется долго
# Поисковики не обновляют индекс
# Используется для временных переводов
return redirect('/temporary-url', code=302)  # По умолчанию в Flask

307 Temporary Redirect:

# Гарантирует сохранение метода запроса
# POST остаётся POST, не становится GET
return redirect('/temp-url', code=307)

Влияние на SEO

Плюсы 301:

  • Поисковики узнают, что URL постоянно изменился
  • Передаёт PageRank (ранг) на новый URL
  • Улучшает консолидацию кэша и авторитета

Минусы неправильного редиректа:

# Неправильно: 302 вместо 301
# Поисковики думают, что это временно
# SEO вес не передаётся
return redirect('/new-url', code=302)  # НЕПРАВИЛЬНО ДЛЯ ПОСТОЯННОГО ПЕРЕЕЗДА

Django пример

from django.shortcuts import redirect
from django.views import View

class OldBlogView(View):
    def get(self, request, *args, **kwargs):
        # 301 редирект на новый URL
        return redirect('new-blog', permanent=True)  # permanent=True = 301

class NewBlogView(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'blog.html')

Проблемы и ошибки

Цепные редиректы (плохо):

# URL A → 301 → URL B → 301 → URL C
# Медленно и может привести к потере SEO веса
# Реши напрямую: URL A → 301 → URL C

Редирект на неправильный статус код:

# Неправильно
return redirect('/new-url')  # По умолчанию 302, а не 301

# Правильно
return redirect('/new-url', code=301)

Редирект в цикл:

# URL A перенаправляет на URL A — бесконечный цикл!
# Браузер выдаёт "ERR_TOO_MANY_REDIRECTS"
@app.get('/page')
def page():
    return redirect('/page', code=301)  # НИКОГДА ТАК НЕ ДЕЛАЙ

Как проверить 301 редирект

# curl показывает статус код
curl -I https://example.com/old-page
# HTTP/1.1 301 Moved Permanently
# Location: https://example.com/new-page

# -L флаг следует редиректам
curl -L https://example.com/old-page

Когда использовать 301

✅ Используй 301:

  • Переименование страницы (навсегда)
  • Переезд на новый домен
  • Консолидация похожих URL
  • Смена структуры URL (www/без www)

❌ НЕ используй 301:

  • Временные переводы (используй 302 или 307)
  • Сезонные переводы
  • A/B тестирование

Практический совет

Для постоянного переезда всегда используй 301:

@app.route('/old-path')
def old_path():
    # Постоянный редирект
    return redirect('/new-path', code=301)

301 статус гарантирует, что поисковики и браузеры правильно обновят свои кэши и ссылки на новый URL, сохраняя весь накопленный SEO вес и авторитет.