Перенаправьте старые URL-адреса форума на новые URL-адреса Discourse с помощью постоянных ссылок

:bookmark: В этом справочном материале объясняется, как постоянные ссылки (пермалинки) Discourse перенаправляют старые пути URL на новые адреса, как работают нормализации пермалинков, а также как тестировать и устранять неполадки с перенаправлениями после миграции или изменения структуры URL.

:person_raising_hand: Требуемый уровень пользователя: Администратор

:computer: Доступ к консоли требуется только при создании пермалинков из импортера, скрипта или через Rails Console

При миграции с другой форумной платформы или изменении структуры URL вашего сайта старые ссылки из поисковых систем, закладок, электронных писем или других сайтов могут перестать вести на нужную страницу.

Постоянные ссылки позволяют перенаправлять старые пути URL на новые адреса с помощью перенаправлений 301 Moved Permanently.

Постоянные ссылки представляют собой точное сопоставление путей. Например, если старый URL больше не работает:

https://discourse.example.com/forum/topic/123

вы можете создать постоянную ссылку, чтобы она перенаправляла на новую тему:

https://discourse.example.com/t/welcome-to-our-community/456

Что такое постоянные ссылки

Постоянная ссылка — это точное сопоставление одного старого пути URL одному новому адресу.

Например:

forum/topic/123 → /t/welcome-to-our-community/456

Постоянные ссылки полезны в следующих случаях:

  • вы мигрировали с другой платформы форума;
  • старые ссылки проиндексированы поисковыми системами;
  • старые ссылки используются в электронных письмах, документации или на других сайтах;
  • вы изменили структуру URL вашего сайта;
  • вы хотите, чтобы старый путь перенаправлял на тему, сообщение, категорию, тег, пользователя или внешний URL.

Каждый URL постоянной ссылки сопоставляется с одним адресом.

Постоянные ссылки требуют точного совпадения. Поле URL постоянной ссылки не поддерживает подстановочные знаки или регулярные выражения. Если множество старых URL имеют предсказуемый шаблон, используйте нормализации пермалинков для преобразования входящих URL перед поиском точного совпадения.

Постоянные ссылки и нормализации

Постоянные ссылки и нормализации выполняют разные задачи:

Функция Что она делает Пример
Постоянная ссылка Перенаправляет один сохраненный старый путь на один адрес old/topic/123 → Topic 456
Нормализация Изменяет входящий путь перед поиском постоянной ссылки old/topic/123-title → old/topic/123

Нормализация сама по себе не выполняет перенаправление. Она лишь изменяет путь, используемый для поиска сохраненной постоянной ссылки.

После применения нормализации вам по-прежнему потребуется совпадающая постоянная ссылка.

Быстрые примеры

Перенаправление старого URL темы

Старый URL:

https://discourse.example.com/forum/topic/123

URL постоянной ссылки:

forum/topic/123

Тип адреса:

Тема

Адрес:

456

Результат:

/forum/topic/123 → /t/welcome-to-our-community/456

Перенаправление старого URL с параметрами запроса

Старый URL:

https://discourse.example.com/viewtopic.php?t=123

URL постоянной ссылки:

viewtopic.php?t=123

Тип адреса:

Тема

Адрес:

456

Результат:

/viewtopic.php?t=123 → /t/welcome-to-our-community/456

Перенаправление множества старых URL с одинаковым шаблоном

Старые URL:

/forum/support/123-how-do-i-reset-my-password.html
/forum/general/456-how-do-i-change-my-email.html

Вы можете использовать нормализацию для упрощения их перед поиском:

/forum/support/123-how-do-i-reset-my-password.html → forum/123
/forum/general/456-how-do-i-change-my-email.html → forum/456

Затем создайте точные постоянные ссылки:

forum/123 → Topic 1001
forum/456 → Topic 1002

Что вводить в качестве URL постоянной ссылки

Введите старый путь, а не полный URL.

Например, используйте:

forum/topic/123

или:

/forum/topic/123

Не используйте полный старый URL:

https://discourse.example.com/forum/topic/123

Ведущие слэши принимаются, но удаляются при сохранении постоянной ссылки. Эти две записи эквивалентны:

/forum/topic/123
forum/topic/123

Обе сохраняются как:

forum/topic/123

Ведущие и конечные пробелы удаляются при сохранении постоянной ссылки.

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

Постоянные ссылки сопоставляются с полным путем запроса, включая параметры запроса.

Это означает, что эти два URL являются разными совпадениями для постоянных ссылок:

/old/topic/123
/old/topic/123?utm_source=example

Если старый URL содержит параметры запроса, либо:

  1. создайте постоянную ссылку, включающую параметры запроса, либо
  2. используйте нормализацию постоянной ссылки для удаления или упрощения параметров запроса перед сопоставлением

Для большинства аналитических или отслеживающих параметров использование нормализации обычно лучше, чем создание множества отдельных постоянных ссылок.

Например, эта сохраненная постоянная ссылка:

docs/123

не обязательно будет совпадать с этим запрошенным URL:

/docs/123?utm_source=newsletter

если только нормализация не удалит параметры запроса перед поиском.

При копировании старых URL из инструментов аналитики, отчетов поисковой консоли, браузеров или кампаний по электронной почте проверяйте, были ли добавлены параметры отслеживания.

Фрагменты URL не являются частью совпадения

Фрагменты URL не отправляются на сервер.

Например, этот URL:

/old/topic#post-12

поступает на сервер как:

/old/topic

Постоянная ссылка или нормализация не могут совпасть с:

#post-12

если только символ # не закодирован в самом запросе как %23.

Поддерживаемые адреса постоянных ссылок

Постоянная ссылка может перенаправлять на один из следующих типов адресов:

  • Тема
  • Сообщение
  • Категория
  • Тег
  • Пользователь
  • Внешний или относительный URL

Внешние или относительные URL-адреса можно использовать для перенаправлений, таких как:

old/privacy-policy → https://archive.discourse.example.com/privacy

или:

old/preferences → /my/preferences

Используйте адреса внешних URL с осторожностью. Они перенаправляют посетителей с вашего сайта и не проверяют существование целевого URL.

Предпочитайте внутренние типы адресов при перенаправлении на мигрированные темы, сообщения, категории, теги или пользователей. Используйте адрес внешнего URL, когда целевая страница не представлена внутренним объектом.

Добавление постоянной ссылки вручную

Чтобы добавить постоянную ссылку вручную:

  1. Перейдите на страницу /admin/config/permalinks.
  2. Выберите вкладку Постоянные ссылки.
  3. Нажмите Добавить постоянную ссылку.
  4. Введите старый путь в поле URL.
  5. Выберите Тип постоянной ссылки.
  6. Введите или выберите адрес.
  7. Сохраните постоянную ссылку.
  8. Протестируйте старый URL в браузере или с помощью curl.

Пример:

URL:
forum/topic/123

Тип постоянной ссылки:
Тема

Адрес:
456

Запрос к:

https://discourse.example.com/forum/topic/123

будет перенаправлен на тему 456.

Значения адресов

Значение адреса зависит от типа постоянной ссылки.

Тип постоянной ссылки Адрес
Тема Тема
Сообщение Сообщение
Категория Категория
Тег Тег
Пользователь Пользователь
Внешний или относительный URL Полный внешний URL или относительный путь

Примеры:

forum/topic/123 → Topic 456
forum/post/789 → Post 789
forum/category/support → Category support
forum/tag/example → Tag example
forum/user/alice → User alice
old/privacy → https://archive.discourse.example.com/privacy
old/preferences → /my/preferences

Создание постоянных ссылок во время миграции

Многие официальные импортеры автоматически создают постоянные ссылки для мигрированных категорий, тем, сообщений или пользователей.

При крупных миграциях постоянные ссылки обычно создаются импортером или скриптом миграции, а не вводятся вручную по одной.

Если вы пишете собственный импортер, создавайте записи постоянных ссылок для старых URL, которые должны продолжать работать после миграции.

Например:

Permalink.create!(url: "discussion/12345", topic_id: 987)

В этом примере discussion/12345 — это старый путь, а 987 — идентификатор темы Discourse.

Принимается и ведущий слэш:

Permalink.create!(url: "/discussion/12345", topic_id: 987)

Оба примера сохраняют URL постоянной ссылки как:

discussion/12345

Для перенаправления на внешний URL:

Permalink.create!(
  url: "discussion/12345",
  external_url: "https://archive.discourse.example.com/discussion/12345"
)

При создании постоянных ссылок в импортере:

  • сохраняйте старый путь, а не полный старый домен;
  • включайте параметры запроса только если они необходимы для совпадения;
  • убедитесь, что каждый старый путь сопоставляется с одним адресом;
  • проверяйте дубликаты перед вставкой записей;
  • помните, что URL постоянных ссылок должны быть уникальными.

Если вы запускаете несколько тестовых миграций, окончательные идентификаторы тем и сообщений могут измениться между запусками. Генерируйте или проверяйте окончательные сопоставления постоянных ссылок, когда данные производственной миграции стабилизируются.

Что такое нормализации постоянных ссылок

Нормализация постоянной ссылки изменяет входящий старый путь перед поиском совпадающей постоянной ссылки.

Нормализации полезны, когда многие старые URL имеют один и тот же предсказуемый шаблон.

Например, предположим, что ваш старый форум использовал такие URL:

/forum/support/123-how-do-i-reset-my-password.html

но ваша сохраненная постоянная ссылка проще:

forum/123

Нормализация может преобразовать входящий запрос в путь сохраненной постоянной ссылки:

/forum/support/123-how-do-i-reset-my-password.html
        ↓
forum/123

Затем постоянная ссылка может выполнить перенаправление:

forum/123 → /t/how-do-i-reset-my-password/456

Нормализация сама по себе не выполняет перенаправление. Она лишь изменяет путь, используемый для поиска постоянной ссылки.

Вам по-прежнему потребуется совпадающая постоянная ссылка для нормализованного пути.

Большинству сайтов не требуются нормализации постоянных ссылок. Используйте их только тогда, когда многие старые URL имеют предсказуемый шаблон и создание одной постоянной ссылки для каждого старого URL было бы непрактичным.

Как работают постоянные ссылки и нормализации вместе

При запросе старого URL процесс выглядит следующим образом:

Посетитель запрашивает старый URL
        ↓
Применяются нормализации постоянных ссылок, если они настроены
        ↓
Выполняется поиск постоянной ссылки с использованием полученного пути
        ↓
Если совпадающая постоянная ссылка существует, посетитель перенаправляется

Например:

Запрошенный URL:
/old/topic/123?utm_source=newsletter

Нормализация изменяет его на:
old/topic/123

Постоянная ссылка перенаправляет его на:
/t/new-topic-title/456

Добавление нормализации постоянной ссылки

Нормализации постоянных ссылок настраиваются в настройках постоянных ссылок.

Чтобы добавить одну:

  1. Перейдите на страницу /admin/config/permalinks.
  2. Выберите вкладку Настройки.
  3. Добавьте правило в настройку permalink normalizations.
  4. Сохраните настройку.
  5. Протестируйте старый URL, который должен быть нормализован.
  6. Убедитесь, что нормализованный путь совпадает с существующей постоянной ссылкой.

Синтаксис:

/<regex>/<replacement>

Несколько правил разделяются символом |.

Например:

/old\/topic\/(\d+).*/topic/\1

Это может преобразовать:

old/topic/123-my-old-title

в:

topic/123

Замена использует синтаксис замены Ruby, поэтому захваченные группы записываются как:

\1
\2
\3

Важные правила нормализации

Делайте правила нормализации простыми.

  • Нормализации используют регулярные выражения Ruby.
  • Символы / в части регулярного выражения должны быть экранированы как \/.
  • Символы / в части замены не нужно экранировать.
  • Несколько правил нормализации разделяются символом |.
  • Поскольку | разделяет правила, избегайте использования альтернативы регулярных выражений с |.
  • Каждое правило использует одну замену, а не глобальную замену.
  • Правила применяются по порядку.
  • Совпадающие правила применяются последовательно.
  • Нормализации применяются перед поиском постоянной ссылки.
  • Нормализации также применяются при сохранении записей постоянных ссылок.
  • Валидатор настроек обнаруживает недопустимые регулярные выражения, но может не обнаружить каждое правило, которое ведет себя иначе, чем предполагалось.

:warning: Предупреждение: Нормализации применяются при сохранении записей постоянных ссылок. Если вы введете ненормализованный URL в административном интерфейсе, он может быть сохранен как результат нормализации. Если вы добавите или измените нормализации после создания постоянных ссылок, тщательно протестируйте и проверьте, как сохраняются новые URL постоянных ссылок.

Примеры нормализации

Перенаправление старого URL с дополнительным текстом заголовка

Старые URL:

/forum/support/123-how-do-i-reset-my-password.html
/forum/general/456-how-do-i-change-my-email.html

Вы можете нормализовать их до более простых путей постоянных ссылок:

forum/123
forum/456

Пример нормализации:

/forum\/[^\/]+\/(\d+).*/forum/\1

Затем создайте постоянные ссылки:

forum/123 → Topic 1001
forum/456 → Topic 1002

Игнорирование отслеживающих параметров запроса

Запрошенный старый URL:

/docs/123?utm_source=newsletter

Сохраненная постоянная ссылка:

docs/123

Нормализация:

/(docs\/\d+)\?.*/\1

Это удаляет параметры запроса перед поиском постоянной ссылки.

Сохранение важного параметра запроса

Некоторые старые форумы используют параметры запроса в качестве стабильного идентификатора темы.

Например:

viewtopic.php?f=10&t=123
viewtopic.php?t=123

Вы можете захотеть нормализовать их до:

viewtopic.php?t=123

Пример нормализации:

/(viewtopic\.php\?)(?:.*&)?(t=\d+).*/\1\2

Затем создайте постоянную ссылку:

viewtopic.php?t=123 → Topic 456

Регулярные выражения и перенаправления с подстановочными знаками

Поле URL постоянной ссылки не поддерживает регулярные выражения или подстановочные знаки.

Это не будет работать как URL постоянной ссылки:

forum/topic/*

Это тоже не будет работать как URL постоянной ссылки:

forum/topic/(\d+)

Если вам нужна обработка на основе шаблонов, используйте нормализацию постоянной ссылки для преобразования входящего URL в форму, которая может совпасть с сохраненной точной постоянной ссылкой.

Например:

/forum/topic/123-title → forum/topic/123

Затем создайте обычную точную постоянную ссылку:

forum/topic/123 → Topic 456

Приоритет маршрутизации и встроенные пути

Маршрутизация постоянных ссылок проверяется после обычных маршрутов приложения.

Это означает, что существующий действительный маршрут может разрешиться нормально до проверки постоянной ссылки.

Будьте осторожны со старыми URL, которые начинаются со встроенных путей, таких как:

/t
/c
/u
/tag
/tags

Например, старый URL форума, такой как этот, может выглядеть как маршрут встроенной категории:

/c/blog/old-platform-url/ba-p/12345

Если старый URL конфликтует с существующим действительным маршрутом, действительный маршрут может иметь приоритет над постоянной ссылкой.

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

t/123

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

Некоторые встроенные маршруты «не найдено» имеют дополнительное поведение по умолчанию, но не стоит на это полагаться. Всегда тестируйте старые URL, которые пересекаются со встроенными путями.

Если вам нужно, чтобы старый URL темы перенаправлялся куда-то еще, старый URL темы, как правило, не должен продолжать разрешаться как действительный маршрут темы.

Разрешения и приватный контент

Постоянные ссылки на внутренние адреса учитывают обычные разрешения.

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

Постоянные ссылки на внешние URL не проверяют внутренние разрешения контента.

Специальные символы и закодированные URL

Тщательно тестируйте URL со специальными символами.

Это включает URL с:

  • пробелами
  • +
  • %
  • &
  • '
  • :
  • скобками
  • символами не латинского алфавита

Сопоставление постоянных ссылок использует закодированный путь запроса после удаления ведущего слэша и применения настроенных нормализаций. Различия в кодировке могут помешать URL совпасть с ожидаемой постоянной ссылкой.

Например, эти URL могут не быть эквивалентными в зависимости от того, как запрашивается и хранится старый URL:

old/topic/hello%20world
old/topic/hello+world

Используйте %20 для пробелов в примерах URL. В пути URL + не то же самое, что пробел.

Символы, такие как &, ? и #, имеют специальное значение в URL. Если они предназначены для буквальных символов пути, их следует закодировать в процентах.

Если сомневаетесь, протестируйте точный старый URL, который будут запрашивать пользователи или поисковые системы.

Ограничения

Постоянные ссылки предназначены для перенаправления старых путей на новые адреса. Они не являются универсальным механизмом перенаправления или переписывания.

Важные ограничения:

  • URL постоянных ссылок сохраняются как путь и строки запроса, а не полные URL.
  • Полные URL автоматически не преобразуются в пути.
  • URL постоянных ссылок должны быть уникальными после нормализации.
  • URL постоянной ссылки может иметь только один адрес.
  • Поддерживаемые адреса ограничены темами, сообщениями, категориями, тегами, пользователями и внешними или относительными URL.
  • Постоянные ссылки используют 301 Moved Permanently; нет опции для 302 на уровне каждой постоянной ссылки.
  • Поле URL постоянной ссылки не поддерживает подстановочные знаки или регулярные выражения.
  • Строки запроса являются частью ключа поиска.
  • Фрагменты URL, такие как #post-12, не отправляются на сервер и не могут быть сопоставлены.
  • Сопоставление не использует схему или хост запроса.
  • Нативные маршруты проверяются перед маршрутом перехвата постоянных ссылок.
  • Внутренние адреса проверяются на разрешения.
  • Адреса внешних URL обходят проверки разрешений внутреннего контента.
  • Нормализации постоянных ссылок используют регулярные выражения Ruby.
  • Правила нормализации разделяются символом |, поэтому избегайте использования | в качестве альтернативы регулярных выражений.
  • Правила нормализации используют одну замену на правило, а не глобальную замену.
  • Нормализации применяются как перед поиском, так и перед сохранением записей постоянных ссылок.
  • Валидатор настроек обнаруживает недопустимые регулярные выражения, но может не обнаружить каждое правило, которое ведет себя иначе, чем предполагалось.

Для большинства сайтов простые постоянные ссылки «один к одному» проще в обслуживании, чем сложные правила нормализации. Используйте нормализации только тогда, когда старые URL имеют предсказуемый шаблон.

Избегайте перенаправления каждого старого URL на главную страницу

Не перенаправляйте все старые URL на вашу главную страницу.

Перенаправляйте каждый старый URL на наиболее релевантную новую страницу. Если эквивалентного контента нет, 404 может быть лучше, чем отправка пользователей и поисковых систем на нерелевантную страницу.

Хорошие перенаправления конкретны:

old/topic/123 → новая тема о том же предмете

Плохие перенаправления общие:

old/topic/123 → главная страница
old/topic/456 → главная страница
old/topic/789 → главная страница

Тестирование перенаправлений

После создания постоянных ссылок или нормализаций протестируйте выборку старых URL.

Вы можете протестировать в браузере или использовать:

curl -I https://discourse.example.com/forum/topic/123

Работающее перенаправление постоянной ссылки должно возвращать постоянное перенаправление, подобное:

HTTP/2 301
location: https://discourse.example.com/t/welcome-to-our-community/456

Протестируйте примеры из каждого шаблона старого URL, включая:

  • старые URL тем
  • старые URL категорий
  • старые URL сообщений
  • URL с параметрами запроса
  • URL со специальными символами
  • URL из результатов поиска
  • URL из старых электронных писем или документации
  • URL, начинающиеся со встроенных путей, таких как /t, /c или /u
  • перенаправления на внешние URL

Устранение неполадок

Если старый URL не перенаправляется, проверьте эти распространенные причины:

  1. Убедитесь, что постоянная ссылка существует.
  2. Убедитесь, что URL постоянной ссылки — это старый путь, а не полный старый домен.
  3. Проверьте, содержит ли старый URL параметры запроса.
  4. Если используется нормализация, убедитесь, что нормализованный путь совпадает с сохраненной постоянной ссылкой.
  5. Проверьте, не имеет ли приоритет встроенный маршрут.
  6. Проверьте, является ли адрес приватным или ограниченным.
  7. Проверьте различия в кодировке, такие как %20 против +.
  8. Проверьте, не изменила ли нормализация URL при сохранении постоянной ссылки.
  9. Убедитесь, что контент был мигрирован.
  10. Протестируйте с точным старым URL из браузера или с помощью curl -I.

Самые распространенные проблемы:

  • ввод полного старого URL вместо старого пути
  • отсутствующие или неожиданные параметры запроса
  • ожидание работы подстановочных знаков или регулярных выражений в поле URL постоянной ссылки
  • пересечение старых URL со встроенными путями
  • приватные или ограниченные адреса
  • различия в кодировке
  • неожиданное изменение пути нормализациями

Примечания по SEO

После миграции поисковые системы могут сообщать, что старые URL перенаправлены. Это ожидаемо, если эти старые URL теперь перенаправляют на правильные новые страницы.

Для лучших результатов:

  • перенаправляйте старые URL на релевантные новые страницы
  • избегайте ненужных цепочек перенаправлений
  • избегайте перенаправления множества нерелевантных URL на главную страницу
  • оставляйте перенаправления включенными достаточно долго, чтобы пользователи и поисковые системы обновились
  • тестируйте важные URL из вашей старой карты сайта, аналитики или данных поисковой консоли
37 лайков