通过路由重定向内部链接

我在网站上设置了以下重定向:example.com/[0-9]+/[0-9]+example.com/tag/$1-$2,其中 $1 和 $2 是来自先前正则表达式的值。我编写了下面的简单插件,并且在 URL 栏中输入 example.com/[0-9]+/[0-9]+ 时可以完美运行。但是,如果在 discourse 中的帖子中提供相同的链接,重定向将不起作用。有什么方法可以实现这一点?


Discourse::Application.routes.append do
    get '/:year/:id', to: redirect('/tag/%{year}-%{id}') , constraints: {year: /[0-9]+/, id: /[0-9]+/}
end

您需要重写原始帖子中的内部链接(并重新烘焙)。

3 个赞

这只会改变到目前为止的帖子,对吗?我需要为每个新帖子都这样做吗?

Discourse 会写入新的链接,因此它们从一开始就是正确的。

或者,您可能要导入更多帖子,在这种情况下,您将修改导入脚本来修复它们。

我最初设置该路由的目的与导入无关。我想使用 example.com/123/456(这里的 123 和 456 是任意的,只要它们都是 [0-9]+)作为 example.com/tag/123-456 的快捷方式,因此使用它在语义上“没有错”。

但是,该路由不适用于内部链接(我需要刷新网站才能使该路由生效),因此我需要检测每个 example.com/[0-9]+/[0-9]+ 并将其更改为 example.com/tag/[0-9]+-[0-9]+,这看起来几乎不可能在不逐个解析每个新帖子的情况下完成。

抱歉,我没注意到您的问题是关于不喜欢标签的路由。您认为更改该路由有什么价值?人们会手动输入它们吗?他们不会,因为 Discourse 会让他们搜索和输入。

您能退一步说说,您通过从标签路由中移除“标签”来解决什么问题吗?

我的网站在预印本服务器和标签之间创建了一一对应的关系。我的用户习惯于访问网站 preprint.com/123/456,其中 123-456 是论文的 ID。这对应于 mywebsite.com - This website is for sale! - mywebsite Resources and Information. mywebsite.com - This website is for sale! - mywebsite Resources and Information. 重定向到 mywebsite.com - This website is for sale! - mywebsite Resources and Information.

这个想法是,用户可以将 preprint.com 替换为 mywebsite.com,然后直接访问他们正在浏览的预印本服务器上的确切论文页面。这之前一直运行良好,直到有人在一个帖子中提供了一个内部链接 mywebsite.com - This website is for sale! - mywebsite Resources and Information. 404。我正在使用 Discourse,用户群非常特定且目标明确,因此我的用例可能听起来很奇怪。

啊哈。那么我认为您想要一个主题组件,可以在链接被输入到帖子中时重写这些链接。我不太确定该怎么做。一个需要一些用户培训的方法是使用 bbcode 来处理这些链接。但我认为一个主题组件可以劫持这些链接并在它们被烘焙时重写它们。

在您提到主题组件后,我使用以下组件部分地完成了我想要的功能:Auto-Linkify Words

它完美支持正则表达式,因此每当有人输入 mywebsite.com - This website is for sale! - mywebsite Resources and Information. 时,它都会成功地将链接替换为 mywebsite.com - This website is for sale! - mywebsite Resources and Information.

唯一剩下的问题是,如果有人输入带有前缀 https:// 的网址,它就无法正常工作。不过,它仍然是一个非常好的组件。

1 个赞

太棒了!我认为自定义主题组件也可以修复那些使用 https 的问题,但也许你可以尝试训练人们不要使用它,或者使用 #123-456

1 个赞