使用永久链接将旧论坛网址重定向到新的 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 重定向问题
永久链接规范化
最后由 @SaraDev 于 2022-06-03T20:00:00Z 审核*
37 个赞
Tealk
88
是否可以将重写规则直接存储在 discourse docker 集群中?有一个 Web 服务器负责处理 http 和 ssl,我可以在那里添加一些东西吗?
location /threads/ {
rewrite ^/threads/(.*)\.\d+/?$ /t/$1 permanent;
}
pfaffman
(Jay Pfaffman)
89
我不知道那怎么可能行得通,因为 nginx 不知道新的主题 ID。/threads ID 需要转换为 Discourse 主题 ID。
Tealk
90
如果我调用 /threads/name.1234,它会被重写为 /t/name,然后显示正确的帖子,此时 ID 不会被使用,我刚刚测试过。
pfaffman
(Jay Pfaffman)
91
可能只有在你运气好的时候,Discourse 和你的旧论坛才会生成相同的 slug(并且 slug 不以数字开头),但这可能已经足够了。
如果你想按你建议的那样更改 NGINX,你可以查看 discourse_docker 中的 web 模板,了解如何在容器内更改 nginx 配置。这是一个例子:
1 个赞
pfaffman
(Jay Pfaffman)
93
不。您将把它添加到 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 个赞
Tealk
94
谢谢你的帮助,我已经调整了nginx配置,它能按预期工作。
1 个赞
Tealk
95
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): 解析带引号的标量时发现未知转义字符 错误。
pfaffman
(Jay Pfaffman)
96
请查看使用多个域名/重定向设置 Let’s Encrypt,并使用与其中添加至 nginx 配置的示例相同的方式。\n\n您可以将其放在(您将添加的)after_ssl 挂钩中,就像该示例一样。
Tealk
98
我仍然收到相同的错误,我认为这与我的格式设置有关。
1 个赞