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

Продолжение обсуждения из темы Discourse rewriting url path behaviour failing due to subfolder:

У меня точно такая же проблема, описанная в упомянутой теме: URL переписывается только в тех случаях, когда начало подмаршрута совпадает с подпапкой. Я использую /f в качестве подпапки; я понимаю все подводные камни и сложности такой настройки, но всё остальное работает корректно, поэтому, если возможно, я хотел бы получить помощь в решении этой проблемы.

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

Вот примеры маршрутов, которые переписываются неправильно:

  • /f/t/food-chain-magnate/4826/f/tood-chain-magnate/4826
  • /f/tag/food-chain-magnate/f/tagood-chain-magnate
  • /f/u/renato/follow/following/f/u/renatoollow/following
  • /f/u/fred/summary/f/ured/summary

Поскольку это переписывание выполняется на стороне клиента, запросы через CURL к тем же URL работают корректно.

Вот коммит, который изначально исправил эту проблему, но функция getURL изменилась и теперь использует вспомогательные функции get-url вместо Discourse.BaseUri.

Анализируя вызовы getURL, видно, что location.pathname корректен при первом вызове (начинается с /f), но на одном из следующих вызовов подпапка удаляется, и путь становится /t/f-started-slug/id, из-за чего это замещение срабатывает для этого /f.

Я недостаточно хорошо знаю внутреннее устройство Discourse, чтобы полностью понять, где именно происходит это переписывание, но при тестировании в моём экземпляре принудительное ограничение замещения в функции withoutPrefix только на начало пути path кажется исправляет проблему.

// изменение ...
return path.replace(rootURL, "");
// на что-то вроде ... (предполагая, что rootURL не требует экранирования)
return path.replace(new RegExp("^" + rootURL), "")
// или без регулярных выражений ...
return path.indexOf(rootURL) === 0 ? path.slice(rootURL.length) : path;

Не знаю, является ли это возможным решением и не приведёт ли оно к регрессии, любая помощь будет оценена.

1 лайк

Что ж, более тщательный поиск по существующим темам привёл бы меня к ответу от вчерашнего дня, который мог бы решить эту проблему…
https://meta.discourse.org/t/two-bugs-with-usernames-starting-with-subfolder-name/169505/6

РЕДАКТИРОВАНИЕ: Я только что обновился до версии 70050a8ba3, и проблема сохраняется.

2 лайка

Я посмотрю на это, как только освобожусь.

4 лайка

Действительно, это верный путь. Спасибо за расследование и сообщение об ошибке. Этот PR должен исправить ситуацию:

@renato, не могли бы вы попробовать это?

2 лайка

Теперь всё работает отлично, спасибо!

2 лайка

Эта тема была автоматически закрыта через 7 дней. Новые ответы больше не принимаются.