Последнее обновление ломает постоянные ссылки для категорий

После последнего обновления постоянная ссылка на категорию перестала работать, а ссылки на темы функционируют нормально.
Например: category/11562 перенаправляет на c/11562, что неверно; правильно настроенное перенаправление должно вести на c/general/4 или c/4.
Может ли кто-нибудь помочь решить эту проблему?

Вы создали постоянную ссылку для категории/11562, которая раньше перенаправляла на раздел «Общее», но теперь она не работает?

Из какой ветки обновлений это?

Верно, раньше всё работало отлично. Затем я обновился до:

<meta name="generator" content="Discourse 3.3.0.beta1-dev - https://github.com/discourse/discourse version 0bb492c6b6b79389a12b277b9d25b99e75f2625d">

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

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

Посмотрите, пожалуйста, есть ли пермалинк в вашей базе данных и указывает ли он всё ещё в нужное место?

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

Извините, в одном посте разрешена только одна скриншот

Ваш постоянная ссылка находится не по адресу /category/11562, а по адресу /forum/category/11562.

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

Я не понимаю: если я проверяю ответ на https://preview.vaadin.com/forum/category/11562,

я получаю 302 с Location:
https://preview.vaadin.com/forum/c/11562

В то время как для тем, например:
https://preview.vaadin.com/forum/thread/851770

я получаю 301 с Location:
https://preview.vaadin.com/forum/t/tabsheet-tabs-not-displaying-properly-in-ie8-after-upgrade-to-6-7-1/173931

Я ожидаю, что Discourse будет обрабатывать оба случая одинаково, и, как вы видите, в обоих случаях сохраняется сегмент /forum/.

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

Я копнул немного глубже и не понимаю, как это вообще могло работать, поскольку category/ всегда вызывает маршрут categories#redirect, и это не менялось недавно.

get "category/*path" => "categories#redirect"

РЕДАКТИРОВАНИЕ: пост ниже показывает, что раньше это работало

Да. Я даже не могу представить, как постоянные ссылки и permalink_normalizations будут работать при установке в подпапке.

И это всегда была установка в подпапке?

И ничего другого не изменилось, когда вы снова запустили скрипт импорта?

Похоже, что наиболее вероятно, что в вашем скрипте есть какая-то разница.

Подождите. https://meta.discourse.org/category/67 перенаправляет на Announcements - Discourse Meta, так что… нет, но есть спецификация, показывающая, что постоянные ссылки переопределяют это перенаправление /category, и ей уже 4–5 лет.

Поэтому я думаю, что следующим шагом я бы вручную создал несколько перенаправлений категорий, чтобы понять, что происходит (например, /category/mycategory или что-то ещё, где даже нет цифр).

Хорошая находка, @pfaffman, этот тест означает, что это действительно должно было сработать.

Вау, я даже не знал, что это возможно!

Да, это довольно удобно, см. Serve Discourse from a subfolder (path prefix) instead of a subdomain

Спасибо за все ваши ответы!

Интересно, что мы выяснили: постоянные ссылки для категорий работают из подпапки только в том случае, если в исходном URL нет пути /category/, как упоминал @pfaffman в своем ответе. Например, /forum/category_foo/123 корректно перенаправляется в целевую общую категорию.
Discourse перехватывает /category/ и заменяет его на /c/.
Следовательно, это можно решить очень просто:
добавить постоянную ссылку с /c/11562, которая является перенаправлением со старого category/11562 на категорию General /c/4.

И вы были правы: первая установка была без подпапки, вторая — с подпапкой, а это уже третья. Мы протестировали, и я считаю, что первые два раза всё работало. Единственное, что изменилось между второй и третьей установкой, — это то, что между первой и второй мы не очищали базу данных, а третья была чистой установкой с новой базой данных вне Docker (помимо обновления до Discourse v3). Поэтому я подозреваю, что что-то изменилось в бета-версии Discourse v3. Иначе зачем бы это когда-либо работало, даже без подпапки?

Вот ваш ответ

Если я правильно понял, вы имеете в виду, что Discourse применяет перенаправление с /category/ на /c/ только в том случае, если в маршруте есть сегмент.

Тем не менее, если взять ваш форум в качестве примера: https://meta.discourse.org/ и перейти по адресу https://meta.discourse.org/category/1, вас перенаправит на https://meta.discourse.org/c/bug/1.

То же самое мы наблюдаем в нашей установке. Было бы невозможно, чтобы ваш сайт перенаправлял с /category/#старый_номер на /c/#реальная_категория; вы всегда оказывались бы на /c/#старый_номер.