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

**URL:** https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019
**Category:** Support
**Created:** [12.Август.2022 18:19:54 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019 "2022-08-12T18:19:54Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![attj](https://avatars.discourse-cdn.com/v4/letter/a/a698b9/32.png) [@attj](https://meta.discourse.org/u/attj)
#### Post date: [12.Август.2022 18:19:54 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/1 "2022-08-12T18:19:54Z")

</div>

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

```plaintext

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

```

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14.Август.2022 00:35:39 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/2 "2022-08-14T00:35:39Z")

</div>

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

---

<div class="post-metadata">

### Author: ![attj](https://avatars.discourse-cdn.com/v4/letter/a/a698b9/32.png) [@attj](https://meta.discourse.org/u/attj)
#### Post date: [17.Август.2022 08:41:49 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/3 "2022-08-17T08:41:49Z")

</div>

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [17.Август.2022 11:42:08 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/4 "2022-08-17T11:42:08Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![attj](https://avatars.discourse-cdn.com/v4/letter/a/a698b9/32.png) [@attj](https://meta.discourse.org/u/attj)
#### Post date: [17.Август.2022 12:16:52 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/5 "2022-08-17T12:16:52Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [17.Август.2022 12:59:22 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/6 "2022-08-17T12:59:22Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![attj](https://avatars.discourse-cdn.com/v4/letter/a/a698b9/32.png) [@attj](https://meta.discourse.org/u/attj)
#### Post date: [17.Август.2022 13:05:31 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/7 "2022-08-17T13:05:31Z")

</div>

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

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [17.Август.2022 13:46:04 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/8 "2022-08-17T13:46:04Z")

</div>

> [@ïtest](#):
>
> Это работало нормально, пока кто-то не добавил внутреннюю ссылку [mywebsite.com/123/456](http://mywebsite.com/123/456) в сообщение, и мы не обнаружили, что она не перенаправляет.

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

---

<div class="post-metadata">

### Author: ![attj](https://avatars.discourse-cdn.com/v4/letter/a/a698b9/32.png) [@attj](https://meta.discourse.org/u/attj)
#### Post date: [17.Август.2022 15:27:33 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/9 "2022-08-17T15:27:33Z")

</div>

После того как вы упомянули компоненты темы, я смог частично реализовать то, что искал, используя следующий компонент: [Auto-Linkify Words](https://meta.discourse.org/t/linkify-words-in-post/82193)

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

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

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [17.Август.2022 15:29:39 UTC](https://meta.discourse.org/t/redirecting-internal-links-via-routes/236019/10 "2022-08-17T15:29:39Z")

</div>

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