# Проблемы с перенаправлением постоянных ссылок из-за того, что фрагмент после "#" не отправляется на сервер

**URL:** https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139
**Category:** Support
**Created:** [29.Октябрь.2019 12:48:53 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139 "2019-10-29T12:48:53Z")
**Posts on this page:** 14
**Page:** 1

<div class="post-metadata">

### Author: ![pgr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pgr/32/156783_2.png) [@pgr](https://meta.discourse.org/u/pgr)
#### Post date: [29.Октябрь.2019 12:48:53 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/1 "2019-10-29T12:48:53Z")

</div>

РЕДАКТ: изменил заголовок темы, чтобы он соответствовал найденной проблеме, спасибо за ответы ниже

У меня наблюдается странное поведение с постоянными ссылками при работе над миграцией.

> Моя проблема не в том, что внутренние ссылки не перенаправляют. Я просто тестирую это, вставляя URL-адреса в адресную строку браузера.

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

> **[Why two Italian language packs?](https://community.suitecrm.com/t/why-two-italian-language-packs/22397)**
>
> Hello, Thank you Roberto for your job! But I’d like to know why there are two different Italian translation projects: one on Transifex platform, which is not complete, and a second one from Roberto Davila, who has just released it. By now, I...

Это перенаправление для **поста** , оно должно вести ко второму посту следующим образом:

> **[Reports disappeared](https://community.suitecrm.com/t/reports-disappeared/38388/2)**
>
> Try this: login with admin and go to Admin-\> Display Modules and Subpanels Check the list of the hidden modules. If it is there, Drag’n’Drop it to “Displayed Modules” list. It happens some times.

> **[Why two Italian language packs?](https://community.suitecrm.com/t/why-two-italian-language-packs/22397)**
>
> Hello, Thank you Roberto for your job! But I’d like to know why there are two different Italian translation projects: one on Transifex platform, which is not complete, and a second one from Roberto Davila, who has just released it. By now, I...

Это перенаправление для **темы** , оно должно вести к:

> **[Reports disappeared](https://community.suitecrm.com/t/reports-disappeared/38388)**
>
> I’m currently running 7.3.1 and while I had “Reports” at one time, I don’t have them in the toolbar. I’ve checked, and they “should” be there. Also, I’m working on a sandbox of 7.7 and I don’t see them there neither (shouldn’t be related, but...

Я знаю, что моя нормализация работает корректно. Мой регулярное выражение:

`/(?:.*)(\/)(?<topicid>\d*.)-(.[^\/#\?]*)(?<parm>\?(\w*)[=](?<start>\d+))?(?:\/)?(\D+(\/)?)?(?<postid>\d+)?(?:\/)?/normalized.\k<topicid>.\k<postid>`

Я проверяю это в консоли `rails`:

```ruby
irb(main):069:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs#16249')
=> "normalized.17978.16249"

irb(main):068:0> Permalink.normalize_url('https://community.suitecrm.com/languages/17978-why-two-italian-language-packs')
=> "normalized.17978."

```

Это именно то, что я планировал. В моей таблице Permalinks у меня следующее:

 ![image](https://global.discourse-cdn.com/meta/original/3X/f/1/f1e6c93f85ee3e2feacc032f92694ac5a3a94d57.png)

А вот так это выглядит в базе данных:

 ![image](https://global.discourse-cdn.com/meta/original/3X/0/1/013267bab4697613de00f4c3fb366bfa09f1f07b.png)

**Но** когда я ввожу это в адресную строку браузера:

> **[Why two Italian language packs?](https://community.suitecrm.com/t/why-two-italian-language-packs/22397)**
>
> Hello, Thank you Roberto for your job! But I’d like to know why there are two different Italian translation projects: one on Transifex platform, which is not complete, and a second one from Roberto Davila, who has just released it. By now, I...

оно перенаправляется на:

> **[Reports disappeared](https://community.suitecrm.com/t/reports-disappeared/38388)**
>
> I’m currently running 7.3.1 and while I had “Reports” at one time, I don’t have them in the toolbar. I’ve checked, and they “should” be there. Also, I’m working on a sandbox of 7.7 and I don’t see them there neither (shouldn’t be related, but...

Вместо того, чтобы вести к:

> **[Reports disappeared](https://community.suitecrm.com/t/reports-disappeared/38388/2)**
>
> Try this: login with admin and go to Admin-\> Display Modules and Subpanels Check the list of the hidden modules. If it is there, Drag’n’Drop it to “Displayed Modules” list. It happens some times.

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

Почему хеш `#16249` снова добавляется, если моя нормализация его удалила?

Другой способ выявить это несоответствие (хоть и немного искусственный) — попробовать следующие перенаправления из адресной строки браузера:

[https://community.suitecrm.com/normalized.17978](https://community.suitecrm.com/normalized.17978).  
правильно перенаправляет на:  
[Reports disappeared - 💬 General Discussion - SuiteCRM](https://community.suitecrm.com/t/why-two-italian-language-packs/38388)

А [Why two Italian language packs? - #2 by roberto - Translation and Language Packs - SuiteCRM](https://community.suitecrm.com/normalized.17978.16249)  
**правильно** перенаправляет на:  
[Reports disappeared - #2 by erevodifosin - 💬 General Discussion - SuiteCRM](https://community.suitecrm.com/t/why-two-italian-language-packs/38388/2)

Так почему же это не работает при обычном процессе?

---

<div class="post-metadata">

### Author: ![Stephen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/stephen/32/95011_2.png) [@Stephen](https://meta.discourse.org/u/Stephen)
#### Post date: [29.Октябрь.2019 14:47:55 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/2 "2019-10-29T14:47:55Z")

</div>

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

 ![image](https://global.discourse-cdn.com/meta/original/3X/a/7/a7bfa352782acc1b9b06f6fec0ee2452f5e2c87b.jpeg)

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

---

<div class="post-metadata">

### Author: ![pgr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pgr/32/156783_2.png) [@pgr](https://meta.discourse.org/u/pgr)
#### Post date: [29.Октябрь.2019 14:58:42 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/3 "2019-10-29T14:58:42Z")

</div>

Я упоминал в начале своего поста, что это не так: я не нажимаю на ссылки на своих собственных форумах.

Но, возможно, я неправильно понимаю, что здесь имеется в виду под «внутренними ссылками». Не могли бы вы объяснить подробнее? Если я вставляю URL в адресную строку браузера, как это может быть внутренней ссылкой?

---

<div class="post-metadata">

### Author: ![supermathie](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/supermathie/32/507518_2.png) [@supermathie](https://meta.discourse.org/u/supermathie)
#### Post date: [29.Октябрь.2019 16:04:03 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/4 "2019-10-29T16:04:03Z")

</div>

Идентификатор фрагмента URL (символ # и всё, что после него) браузер никогда не отправляет на сервер — использовать его как часть редиректа невозможно.

---

<div class="post-metadata">

### Author: ![pgr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pgr/32/156783_2.png) [@pgr](https://meta.discourse.org/u/pgr)
#### Post date: [29.Октябрь.2019 16:08:14 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/5 "2019-10-29T16:08:14Z")

</div>

Теперь, когда вы так говорите, это имеет смысл… но это довольно уныло.

Похоже, это полностью исключает возможность корректных редиректов на уровень постов с моих старых форумов, поскольку они используют `#` для этого 😭

Это распространённое ограничение, с которым сталкиваются люди при миграции? Это программное обеспечение Kunena, думаю, это довольно типично, и я уверен, что другие тоже используют хэши для ссылки на посты…

---

<div class="post-metadata">

### Author: ![pgr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pgr/32/156783_2.png) [@pgr](https://meta.discourse.org/u/pgr)
#### Post date: [29.Октябрь.2019 19:07:55 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/6 "2019-10-29T19:07:55Z")

</div>

Я долго обдумывал эту проблему. Это действительно раздражающее ограничение. Думаю, основная ошибка была допущена ещё давно разработчиками форума Kunena, когда они использовали только фрагменты URL для маркировки ссылок на сообщения… вздох.

Я вижу три подхода, которые Discourse мог бы использовать для обхода этой проблемы (здесь я явно вхожу в область фантазий, так что наслаждайтесь поездкой):

1. При загрузке страницы срабатывает JavaScript, распознаёт хэш-фрагмент в URI и использует его для обращения к серверу с целью повторного перенаправления в правильное место. Это работает, но приводит к двойному перенаправлению, и пользователь видит перезагрузку страницы.

2. Discourse мог бы добавлять (на стороне сервера) тег `id` со старым импортированным `post_id` в HTML каждого сообщения. Таким образом браузер сохранил бы старый хэш-идентификатор и использовал его на перенаправленной странице, прокручивая к нужному месту. Основной недостаток: продвинутая прокрутка Discourse, при которой сообщения загружаются только при прокрутке к ним, делает эту схему недостаточной.

3. Комбинация двух предыдущих подходов: Discourse формирует (на стороне сервера) таблицу соответствия между старыми импортированными `post_id` и новыми `post_number` и отправляет её клиенту при загрузке страницы. JavaScript на клиентской стороне распознаёт наличие хэша в URI, преобразует его с помощью таблицы и использует собственные функции прокрутки для перехода к нужному сообщению.

Реализация этого решения потребует значительных усилий и приведёт к снижению производительности. Однако это _позволило бы_ обеспечить идеальную миграцию…

---

<div class="post-metadata">

### Author: ![Remah](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/remah/32/70590_2.png) [@Remah](https://meta.discourse.org/u/Remah)
#### Post date: [29.Октябрь.2019 19:27:49 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/7 "2019-10-29T19:27:49Z")

</div>

Это не полные решения, так как перенаправления всё равно не будут работать, если пользователь ещё не находится в Discourse. Ссылки извне гораздо реже приводят пользователя именно таким образом.

---

<div class="post-metadata">

### Author: ![pgr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pgr/32/156783_2.png) [@pgr](https://meta.discourse.org/u/pgr)
#### Post date: [29.Октябрь.2019 19:34:17 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/8 "2019-10-29T19:34:17Z")

</div>

Мой текущий подход к внутренним и внешним перенаправлениям заключается в следующем:

Мой старый сайт находится по адресу  
`https://suitecrm.com/suitecrm/forum/`, новый — по адресу  
`https://community.suitecrm.com/`

Когда мигрированный сервер выйдет в онлайн, мы настроим перенаправление на уровне шлюза со старого адреса на новый.

Я оставлю внутренние ссылки без изменений, начиная с `https://suitecrm.com/suitecrm/forum/`. Когда кто-то нажмёт на них, для всех практических целей это будет считаться внешним переходом. Однако затем сработает наше перенаправление на уровне шлюза, и пользователь вернётся в 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: [30.Октябрь.2019 02:03:04 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/9 "2019-10-30T02:03:04Z")

</div>

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

Я часто создаю постоянные ссылки вида `/oldpost/POST_ID`, а затем настраиваю перенаправление постоянных ссылок, чтобы переписывать `/forum./category/someslug#1234` так, чтобы они использовали эти ссылки.

---

<div class="post-metadata">

### Author: ![techAPJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/techapj/32/342990_2.png) [@techAPJ](https://meta.discourse.org/u/techAPJ)
#### Post date: [30.Октябрь.2019 05:38:53 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/10 "2019-10-30T05:38:53Z")

</div>

> [@pfaffman](#):
>
> используйте редиректы постоянных ссылок

Под «редиректом постоянной ссылки» вы имеете в виду настройку сайта «нормализация постоянных ссылок»?

---

<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: [30.Октябрь.2019 12:30:58 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/11 "2019-10-30T12:30:58Z")

</div>

Ой! Да. Извините. Мой мозг уже был уставшим.

---

<div class="post-metadata">

### Author: ![pgr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pgr/32/156783_2.png) [@pgr](https://meta.discourse.org/u/pgr)
#### Post date: [30.Октябрь.2019 12:33:19 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/12 "2019-10-30T12:33:19Z")

</div>

Хорошо 🙂

Но я использую нормализацию постоянных ссылок (см. мой первый пост). Только хеш-часть никогда не отправляется на сервер, поэтому, если только какое-то клиентское JavaScript-решение не делает свою магию, форум, который использует только хеши для ссылок на уровне постов, _никогда_ не сможет быть корректно мигрирован (с точки зрения перенаправлений) в 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: [30.Октябрь.2019 12:40:29 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/13 "2019-10-30T12:40:29Z")

</div>

> [@pgr](#):
>
> На сервер никогда не отправляется только часть после хеша

Извините. Я не прочитал это достаточно внимательно. Я думал, что раньше использовал содержимое после хеша, но, похоже, я ошибался. Помню недавний случай, когда такие идентификаторы постов после хеша присутствовали, но, видимо, клиент хотел только перенаправления на уровне темы. Думаю, что для 301-перенаправлений попадания в нужную тему, скорее всего, достаточно.

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [29.Ноябрь.2019 12:49:54 UTC](https://meta.discourse.org/t/trouble-with-permalink-redirects-due-to-fragment-after-not-being-sent-to-server/132139/14 "2019-11-29T12:49:54Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
