Redirect old forum URLs to new Discourse URLs using permalinks

使用永久链接将旧论坛 URL 重定向到新的 Discourse URL

如果您已使用我们的导入脚本之一从其他论坛软件迁移到 Discourse,那么您可能希望您辛辛苦苦获得的 Google 搜索结果继续指向相同的内容。Discourse 提供了一种内置方式来处理此问题,作为编写 nginx 规则的替代方案,即使用 永久链接查找表

永久链接表允许您设置两件事:要匹配的 URL,以及该 URL 应显示的内容。有几种选项可用于定义 URL 应重定向到的位置。设置其中一个:

  • topic_id:显示一个主题
  • post_id:显示主题内的特定帖子
  • category_id:显示一个类别
  • external_url:重定向到可能不属于您的 Discourse 实例的 URL

例如,如果您的原始论坛的主题 URL 看起来像 http://example.com/discussion/12345,并且导入后该主题的 URL 是 http://example.com/t/we-moved/987,那么您可以这样设置映射:

cd /var/discourse
./launcher enter app
rails c
Permalink.create(url: '/discussion/12345', topic_id: 987)

Discourse 然后将使用HTTP 响应状态码 301(永久移动)执行重定向到主题 ID 12345 的正确 URL。301 应该会促使搜索引擎更新其记录并开始使用新的 URL。

如果您希望某些 URL 重定向到 Discourse 之外,可以通过设置 external_url 来实现:

Permalink.create(url: '/discussion/12345', external_url: 'http://archived.example.com/discussion/12345')

附加信息

要查找子类别的 ID,可以通过其 slug 来查找,如下所示:

Category.find_by_slug('products').id

要删除该 URL 的永久链接,请执行此操作:

Permalink.find_by_url("/blah").destroy

每个 URL 只能有一个永久链接记录,因此只需按 URL 搜索即可。

从 MyBB 创建到 Discourse 的主题映射

Discourse 到 WordPress 的重定向问题

https://meta.discourse.org/t/discourse-to-wordpress-redirect-questions/87031

永久链接规范化


最后由 @SaraDev2022-06-03T20:00:00Z 审核

37 个赞

是否可以将重写规则直接存储在 discourse docker 集群中?有一个 Web 服务器负责处理 http 和 ssl,我可以在那里添加一些东西吗?

location /threads/ {
    rewrite ^/threads/(.*)\.\d+/?$ /t/$1 permanent;
}

我不知道那怎么可能行得通,因为 nginx 不知道新的主题 ID。/threads ID 需要转换为 Discourse 主题 ID。

如果我调用 /threads/name.1234,它会被重写为 /t/name,然后显示正确的帖子,此时 ID 不会被使用,我刚刚测试过。

可能只有在你运气好的时候,Discourse 和你的旧论坛才会生成相同的 slug(并且 slug 不以数字开头),但这可能已经足够了。

如果你想按你建议的那样更改 NGINX,你可以查看 discourse_docker 中的 web 模板,了解如何在容器内更改 nginx 配置。这是一个例子:

1 个赞

非常感谢,我认为这足以分散注意力

我是否必须在每次更新时都进行此更改?

不。您将把它添加到 app.yml 中,它将在每次重建时应用。

为了节省测试时间,您可以:

cd /var/discourse
./launcher enter app
apt update
apt-get install -y vim nano

然后使用 vim 或 nano 编辑您想查看的内容(并为每次重建节省 10-20 分钟)。您可以使用 sv restart nginx 重启 nginx。

以上所有内容均未经测试,但应该接近。

1 个赞

谢谢你的帮助,我已经调整了nginx配置,它能按预期工作。

1 个赞

nginx 必须在 app.yml 的什么位置编写才能自动调整?是在自定义命令的运行区域吗?

因为如果我添加这个:

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "# auth_basic_user_file /etc/nginx/htpasswd;"
      to: "# auth_basic_user_file /etc/nginx/htpasswd;

      location /threads/ {
          rewrite ^/threads/(.*)\.\d+/?$ /t/$1 permanent;
      }"

会报 (\u003cunknown\u003e): 解析带引号的标量时发现未知转义字符 错误。

请查看使用多个域名/重定向设置 Let’s Encrypt,并使用与其中添加至 nginx 配置的示例相同的方式。\n\n您可以将其放在(您将添加的)after_ssl 挂钩中,就像该示例一样。

我仍然收到相同的错误,我认为这与我的格式设置有关。

1 个赞