Проблема, которую решает история адресов
Название записи меняется, слаг вслед за ним тоже, а старые ссылки остаются в поисковой выдаче, чужих статьях и закладках. Без перенаправления они ведут на ошибку. Хранить список прежних адресов и по нему отвечать редиректом — самый надёжный способ избежать потерь.
Простая структура таблицы
slug_history
id — идентификатор
entity_type — тип записи (товар, статья)
entity_id — идентификатор записи
old_slug — прежний слаг (уникальный)
changed_at — дата смены
При каждой смене слага прежнее значение добавляется в эту таблицу, а поле old_slug защищено уникальным индексом.
Как обрабатывать обращение к старому адресу
- ищем запись по актуальному слагу;
- если не нашли, ищем слаг в таблице истории;
- при совпадении отдаём постоянный редирект 301 на актуальный адрес;
- иначе отдаём код 404.
Предотвращение цепочек и циклов
Если запись меняла слаг несколько раз, редирект со всех прежних значений должен вести сразу на актуальный, а не последовательно по цепочке. Кроме того, слаг, освободившийся после смены, нельзя отдавать другой записи, иначе история начнёт конфликтовать с новым содержимым.
Связь: подробнее о вреде цепочек — в статье про цепочки редиректов.
Нужно ли когда-нибудь чистить историю
Таблица растёт медленно, а её польза сохраняется годами, пока на старые адреса ссылаются извне. Удалять записи имеет смысл только если по журналу видно, что обращения к ним прекратились полностью.
Возврат к прежнему адресу
Редактор может передумать и вернуть записи прежний слаг. Приложение должно корректно обработать такую ситуацию: запись из таблицы истории удаляется, а текущий слаг снова становится основным. Иначе получится петля — актуальный адрес будет перенаправлять сам на себя.
- перед сохранением проверяйте наличие слага в истории этой же записи;
- удаляйте такую строку из истории при возврате;
- для слагов других записей возвращать значение нельзя.
История как журнал для аудита
Помимо редиректов таблица переездов — удобный инструмент анализа. По ней можно увидеть, как часто редакторы меняют адреса, какие разделы страдают от нестабильности, и найти страницы, потерявшие трафик после смены слага. Если поле с датой заполнено, сопоставить изменение с динамикой посещаемости несложно.
Частые вопросы
Зачем хранить прежние слаги записей?
Чтобы при обращении по старому адресу автоматически отдавать постоянный редирект на актуальный и не терять трафик и ссылки.
Какой код ответа использовать для старых адресов?
Постоянный редирект 301 на актуальный адрес записи.
Можно ли отдать освободившийся слаг другой записи?
Нет, иначе история адресов начнёт вести на неправильное содержимое; освободившиеся значения лучше резервировать.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.