Перейти к основному содержимому

Руководства / Коды состояния HTTP: разбор

301 и 302: постоянные и временные редиректы

Код 301 говорит, что ресурс переехал навсегда и новый URL должен заменить старый повсюду; код 302 говорит, что переезд временный и настоящим адресом остается исходный URL. Поисковые системы действуют по этой разнице, поэтому неверный код стоит вам позиций.

Что каждый из двух кодов сообщает клиенту

Оба кода отправляют клиента по адресу из заголовка Location, и для посетителя они выглядят одинаково. Разница в том, что с этой информацией делают все остальные. Код 301 предлагает клиентам и поисковым роботам обновить свои записи: заменить закладку, переписать ссылку, индексировать цель вместо источника. Код 302 просит и дальше пользоваться исходным URL, а сейчас просто сделать крюк. Браузеры могут закэшировать 301 и вообще перестать спрашивать сервер; код 302 по умолчанию не кэшируется, если в ответе не сказано иное.

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

  • 301 для смены домена, переезда с HTTP на HTTPS, канонизации без www или с www, постоянной перестройки URL, объединенной или переименованной страницы, а также страницы снятого с продажи товара, которая ведет на ближайшую замену.
  • 302 для страницы техработ, A/B-теста, выбора географической или языковой посадочной страницы, который вы еще можете поменять, короткоживущего URL кампании или временного адреса «зайдите позже».

Никогда не ставьте 301 на то, что собираетесь отменить. Клиенты его кэшируют, поэтому вернувшиеся посетители будут попадать на временный адрес еще долго после удаления правила, а дотянуться до их кэшей нельзя. Обратная ошибка: оставленный на постоянном переезде 302 оставляет старый URL в индексе, новый начинает с ним конкурировать, и сигналы так и остаются разделенными.

Последствия для SEO

В документации Google сказано, что постоянное перенаправление это сигнал считать канонической цель редиректа, а временное таким сигналом не является, поэтому исходный URL сохраняет свое место в индексе. На практике:

  • Код 301 собирает ссылочный вес на цели и со временем заменяет старый URL в индексе новым.
  • Код 302 обычно оставляет исходный URL в индексе. Поисковые системы пытаются угадать намерение, и долго живущий 302 может в итоге быть истолкован как постоянный, но полагаться на верную догадку не стоит.
  • Цепочки редиректов размывают эффект и замедляют обход. Направляйте старые URL сразу на конечный адрес.
  • Перенаправление множества снятых страниц на главную обычно трактуется как мягкий 404, а не как переезд. Ведите на ближайший эквивалент, а если эквивалента нет, отдавайте 410.
  • Что бы вы ни выбрали, согласуйте это с каноническими тегами и картой сайта. Противоречивые сигналы хуже, чем один слегка неоптимальный.

307 и 308: версии, сохраняющие метод

Исходные определения 301 и 302 были неоднозначны насчет метода HTTP, и клиенты сошлись на поведении, которое стандарт теперь описывает как историческое: следуя за 301 или 302 после POST, многие клиенты меняют метод на GET и выбрасывают тело. Для страницы это безобидно. Для обработчика формы или API это разрушает запрос и ни о чем не сообщает.

Код 307 Temporary Redirect значит то же, что 302, а 308 Permanent Redirect то же, что 301, но с одним добавленным требованием: метод и тело обязаны сохраниться. Поэтому для URL, которые получают только запросы GET, 301 и 302 подходят и ожидаются большинством инструментов. Для всего, что принимает POST, PUT, PATCH или DELETE, ставьте 308 на постоянный переезд и 307 на временный. Если же вам нужно, чтобы за POST последовал GET по другому URL, для этого существует 303 See Other.

Как проверить, какой код возвращает URL

  1. Прочитайте строку состояния и цель, не следуя за редиректом:
    curl -sI https://example.com/old-page | grep -Ei "^(HTTP|location|cache-control)"
    В строке состояния будет 301, 302, 307 или 308, а Location покажет, куда он ведет.
  2. Пройдите всю цепочку и посчитайте шаги, чтобы увидеть, не превратился ли один редирект в три:
    curl -sIL -o /dev/null -w "%{num_redirects} hops, final %{http_code}, %{url_effective}\n" https://example.com/old-page
  3. Проверьте методом POST, если адрес его принимает. Если запрос доходит до цели как GET без тела, переведите правило на 307 или 308.
  4. Меняйте код там, где он формируется. Это может быть приложение, конфигурация веб-сервера, правило в .htaccess или CDN. Если перенаправляют оба слоя, побеждает внешний, а внутреннее правило не видно.
  5. Проверяйте на холодном кэше. Браузер, уже закэшировавший 301, продолжает ему подчиняться, поэтому подтвердите результат через curl или приватное окно, прежде чем решить, что правка не сработала.
  6. После постоянного переезда оставьте редирект на месте. Удалив его позже, вы обрываете все ссылки и закладки, которые до сих пор ведут на старый URL.

Наблюдение за редиректом после настройки

Редирект, который сменил код, зациклился или потерял сертификат TLS, оставляет исходный URL отвечающим, поэтому до падения трафика ничего не выглядит сломанным. Внешние проверки, которые пишут точный код состояния и проходят цепочку, покажут это на следующем же запуске, а запуск из многих сетей отличает глобальное изменение правила от проблемы CDN в одном регионе. HostTracker следит за сайтами с 2004 года и выполняет проверки из более чем 300 точек проверки в 158 городах. Посмотрите, что URL возвращает прямо сейчас, с помощью инструмента проверки HTTP, а про коды по обе стороны от этих двух читайте в руководстве по семейству перенаправлений 3xx.

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

Запустите бесплатную проверку своего сайта - аккаунт не нужен.

HTTP check

Следить за этим постоянно

Получайте оповещение в момент сбоя: HostTracker проверяет более чем из 300 локаций и уведомляет по email, SMS, в Slack, Telegram и не только.

Возможности HostTracker

Ещё в этом разделе: Коды состояния HTTP: разбор