Перенаправление внутренних ссылок через маршруты

В настоящее время на моем сайте настроено следующее перенаправление: example.com/[0-9]+/[0-9]+example.com/tag/$1-$2, где $1 и $2 — значения, полученные из предыдущего регулярного выражения. Я написал простой плагин ниже, и он работает идеально, если ввести example.com/[0-9]+/[0-9]+ в адресную строку. Однако, если я даю ту же ссылку в сообщении внутри Discourse, перенаправление не работает. Есть ли способ этого добиться?


Discourse::Application.routes.append do
    get '/:year/:id', to: redirect('/tag/%{year}-%{id}') , constraints: {year: /[0-9]+/, id: /[0-9]+/}
end

Вам нужно переписать внутренние ссылки в необработанных постах (и пересобрать их).

Это изменит только текущие посты, верно? Значит, мне нужно делать это после каждого нового поста?

Новые ссылки будут создаваться Discourse, поэтому они сразу будут корректными.

Или, возможно, вы собираетесь импортировать больше сообщений, в этом случае вам нужно будет изменить скрипт импорта, чтобы исправить их.

Моя первоначальная цель для создания этого маршрута не связана с импортами. Я хотел бы использовать example.com/123/456 (где 123 и 456 — произвольные числа, удовлетворяющие условию [0-9]+) как сокращение для example.com/tag/123-456, чтобы его использование не было семантически «неправильным».

Однако этот маршрут не работает для внутренних ссылок (мне нужно обновить страницу, чтобы он заработал), поэтому мне нужно обнаруживать все ссылки вида example.com/[0-9]+/[0-9]+ и заменять их на example.com/tag/[0-9]+-[0-9]+, что практически невозможно сделать без парсинга каждого нового поста по отдельности.

Извините. Я упустил, что ваша проблема в том, что вам не нравится маршрут для тегов. Почему вы считаете, что изменение этого маршрута будет полезным? Будут ли люди вводить их вручную? Скорее всего, нет, так как Discourse позволяет их искать и вводить.

Не могли бы вы отойти от деталей и объяснить, какую проблему вы решаете, убирая «tag» из маршрута тегов?

Мой сайт устанавливает взаимно однозначное соответствие между научными статьями на сервере препринтов и тегами. Мои пользователи привыкли посещать сайт по адресу preprint.com/123/456 для статьи с идентификатором 123-456. Это соответствует адресу mywebsite.com, поэтому у меня настроен маршрут, который перенаправляет mywebsite.com на mywebsite.com.

Идея в том, что пользователи могут заменить в ссылке preprint.com на mywebsite.com и оказаться на странице именно той статьи, которую они просматривали на сервере препринтов. Всё работало отлично, пока кто-то не опубликовал внутреннюю ссылку mywebsite.com в сообщении, и мы обнаружили, что перенаправление не срабатывает, а вместо этого возвращается ошибка 404. Я использую Discourse для очень специфической и узкой аудитории, поэтому мой случай может показаться странным.

Ага. Тогда, думаю, вам нужен компонент темы, который будет переписывать такие ссылки при их вводе в сообщение. Я не совсем уверен, как это сделать. Один вариант, который потребует некоторого обучения пользователей, — это использование bbcode для таких ссылок. Но я думаю, что компонент темы мог бы просто перехватывать эти ссылки и переписывать их при сохранении.

После того как вы упомянули компоненты темы, я смог частично реализовать то, что искал, используя следующий компонент: Auto-Linkify Words

Он отлично поддерживает регулярные выражения, поэтому, когда кто-то вводит mywebsite.com, ссылка успешно заменяется на https://mywebsite.com/tag/123-456.

Остался один нюанс: он не работает, если URL вводится с префиксом https://. Тем не менее, это всё равно очень хороший компонент.

Круто! Я думаю, что пользовательский компонент темы может исправить и те, у которых https, но, возможно, вы сможете постараться отучить людей от этого или заставить их использовать формат #123-456