Продолжение обсуждения из темы 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;
Не знаю, является ли это возможным решением и не приведёт ли оно к регрессии, любая помощь будет оценена.