客户端路径重写在使用子文件夹设置时失败

继续讨论来自 Discourse 重写 URL 路径行为因子文件夹而失败

我遇到了上述主题中完全相同的问题,即 URL 仅在子路由的开头与子文件夹相同时才会被重写。我使用 /f 作为子文件夹,我了解这种设置的局限性和麻烦,但其他一切运行正常,因此如果可能的话,我希望得到帮助来修复此问题。

我并没有使用现有的 Discourse 路由,但如果单字母子文件夹确实是个问题,我想在考虑更换其他方案之前先尝试修复它。

以下是一些被错误重写的路由示例:

  • /f/t/food-chain-magnate/4826 -\u003e /f/tood-chain-magnate/4826
  • /f/tag/food-chain-magnate -\u003e /f/tagood-chain-magnate
  • /f/u/renato/follow/following -\u003e /f/u/renatoollow/following
  • /f/u/fred/summary -\u003e /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 天后自动关闭,不再接受新回复。