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

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

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

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

  • topic_id: 用于显示一个主题
  • post_id: 用于显示主题内的特定帖子
  • category_id: 用于显示一个分类
  • tag_id: 用于显示一个标签
  • user_id: 用于显示一个用户个人资料
  • external_url: 用于重定向到可能不属于您的 Discourse 实例的网址

例如,如果您的原始论坛的主题网址是 http://example.com/discussion/12345,而该主题导入后的网址是 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 的正确网址。301 应该会促使搜索引擎更新其记录并开始使用新网址。

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

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

附加信息

要查找子分类的 ID,您可以按 slug 查找,如下所示:

Category.find_by_slug('products').id

要删除该网址的永久链接,请执行以下操作:

Permalink.find_by_url("/blah").destroy

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

从 MyBB 到 Discourse 创建主题映射

Discourse 到 WordPress 重定向问题

永久链接规范化


最后由 @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 个赞