В этом справочном материале объясняется, как постоянные ссылки (пермалинки) Discourse перенаправляют старые пути URL на новые адреса, как работают нормализации пермалинков, а также как тестировать и устранять неполадки с перенаправлениями после миграции или изменения структуры URL.
Требуемый уровень пользователя: Администратор
Доступ к консоли требуется только при создании пермалинков из импортера, скрипта или через 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 содержит параметры запроса, либо:
- создайте постоянную ссылку, включающую параметры запроса, либо
- используйте нормализацию постоянной ссылки для удаления или упрощения параметров запроса перед сопоставлением
Для большинства аналитических или отслеживающих параметров использование нормализации обычно лучше, чем создание множества отдельных постоянных ссылок.
Например, эта сохраненная постоянная ссылка:
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, когда целевая страница не представлена внутренним объектом.
Добавление постоянной ссылки вручную
Чтобы добавить постоянную ссылку вручную:
- Перейдите на страницу
/admin/config/permalinks. - Выберите вкладку Постоянные ссылки.
- Нажмите Добавить постоянную ссылку.
- Введите старый путь в поле URL.
- Выберите Тип постоянной ссылки.
- Введите или выберите адрес.
- Сохраните постоянную ссылку.
- Протестируйте старый 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
Добавление нормализации постоянной ссылки
Нормализации постоянных ссылок настраиваются в настройках постоянных ссылок.
Чтобы добавить одну:
- Перейдите на страницу
/admin/config/permalinks. - Выберите вкладку Настройки.
- Добавьте правило в настройку
permalink normalizations. - Сохраните настройку.
- Протестируйте старый URL, который должен быть нормализован.
- Убедитесь, что нормализованный путь совпадает с существующей постоянной ссылкой.
Синтаксис:
/<regex>/<replacement>
Несколько правил разделяются символом |.
Например:
/old\/topic\/(\d+).*/topic/\1
Это может преобразовать:
old/topic/123-my-old-title
в:
topic/123
Замена использует синтаксис замены Ruby, поэтому захваченные группы записываются как:
\1
\2
\3
Важные правила нормализации
Делайте правила нормализации простыми.
- Нормализации используют регулярные выражения Ruby.
- Символы
/в части регулярного выражения должны быть экранированы как\/. - Символы
/в части замены не нужно экранировать. - Несколько правил нормализации разделяются символом
|. - Поскольку
|разделяет правила, избегайте использования альтернативы регулярных выражений с|. - Каждое правило использует одну замену, а не глобальную замену.
- Правила применяются по порядку.
- Совпадающие правила применяются последовательно.
- Нормализации применяются перед поиском постоянной ссылки.
- Нормализации также применяются при сохранении записей постоянных ссылок.
- Валидатор настроек обнаруживает недопустимые регулярные выражения, но может не обнаружить каждое правило, которое ведет себя иначе, чем предполагалось.
Предупреждение: Нормализации применяются при сохранении записей постоянных ссылок. Если вы введете ненормализованный 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 не перенаправляется, проверьте эти распространенные причины:
- Убедитесь, что постоянная ссылка существует.
- Убедитесь, что URL постоянной ссылки — это старый путь, а не полный старый домен.
- Проверьте, содержит ли старый URL параметры запроса.
- Если используется нормализация, убедитесь, что нормализованный путь совпадает с сохраненной постоянной ссылкой.
- Проверьте, не имеет ли приоритет встроенный маршрут.
- Проверьте, является ли адрес приватным или ограниченным.
- Проверьте различия в кодировке, такие как
%20против+. - Проверьте, не изменила ли нормализация URL при сохранении постоянной ссылки.
- Убедитесь, что контент был мигрирован.
- Протестируйте с точным старым URL из браузера или с помощью
curl -I.
Самые распространенные проблемы:
- ввод полного старого URL вместо старого пути
- отсутствующие или неожиданные параметры запроса
- ожидание работы подстановочных знаков или регулярных выражений в поле URL постоянной ссылки
- пересечение старых URL со встроенными путями
- приватные или ограниченные адреса
- различия в кодировке
- неожиданное изменение пути нормализациями
Примечания по SEO
После миграции поисковые системы могут сообщать, что старые URL перенаправлены. Это ожидаемо, если эти старые URL теперь перенаправляют на правильные новые страницы.
Для лучших результатов:
- перенаправляйте старые URL на релевантные новые страницы
- избегайте ненужных цепочек перенаправлений
- избегайте перенаправления множества нерелевантных URL на главную страницу
- оставляйте перенаправления включенными достаточно долго, чтобы пользователи и поисковые системы обновились
- тестируйте важные URL из вашей старой карты сайта, аналитики или данных поисковой консоли