# 将 phpBB3 论坛迁移到 Discourse

**URL:** https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810
**Category:** Migrating to Discourse
**Tags:** how-to
**Created:** [2015年七月5日 22:02 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810 "2015-07-05T22:02:57Z")
**Posts on this page:** 8
**Page:** 24

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年九月2日 21:22 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/806 "2025-09-02T21:22:12Z")

</div>

> [@MichaIng](#):
>
> . Is there a GUI/CLI way to prefix all permalinks with an URL path elemen

请参阅 ~~`SiteSettings.permalink_redirects`~~

编辑：哎呀。固定链接规范化

---

<div class="post-metadata">

### Author: ![MichaIng](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michaing/32/251089_2.png) [@MichaIng](https://meta.discourse.org/u/MichaIng)
#### Post date: [2025年九月2日 23:27 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/807 "2025-09-02T23:27:39Z")

</div>

您是指在 `/admin/site_settings/category/all_results` 中搜索 `permalink_redirects`？我的设置中没有这个选项。

但是 `permalink_normalizations` 有点作用，使用 `/^forum\\/(view.*)/\\1`：

- 所有 phpBB 链接都以 `view` 开头，例如 `viewtopic.php` 和 `viewforum.php`。实际上，在我们的案例中，这似乎是唯一迁移的两个 URL，因此正则表达式可以加强，或者分成两个以进行完全路径匹配。
- 因此，该正则表达式（`sed` 语法）会获取所有以 `/forum/view` 开头的 URL，并删除 `forum/` 部分。

现在我们只需要在 Web 服务器（或我们的情况是 Cloudflare）上将所有 `/phpbb/`（我们旧论坛的路径）重定向到 `/forum/`，剩下的由 Discourse 处理。早知道这样的话，三年前就应该找到这个方法，而不是破坏所有反向链接 🥲。

但请告诉我 `permalink_redirects` 应该在哪里，也许它需要一个插件，或者它是 phpBB 导入插件的一部分等等？

编辑：效果很好：

```console
root@micha:~# curl -IL https://dietpi.com/phpbb/viewtopic.php?p=46083
HTTP/2 301
location: /forum/viewtopic.php?p=46083

HTTP/2 301
location: https://dietpi.com/forum/t/is-there-a-simple-launch-page-for-dietpi/11237/1
x-discourse-route: permalinks/show

HTTP/2 200
x-discourse-route: topics/show

```

第一个重定向 `/phpbb` =\> `/forum` 在 Cloudflare 通过重定向规则完成，以避免给我们的源服务器带来微不足道的负载。第二个重定向到实际主题由 Discourse 通过永久链接完成，通过永久链接规范化删除开头的 `forum/`，以匹配 phpBB 导入插件添加的永久链接，这些永久链接既不包含旧的也不包含新的论坛子目录路径。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年九月3日 00:08 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/808 "2025-09-03T00:08:51Z")

</div>

> [@MichaIng](#):
>
> 但是 `permalink_normalizations` 在某种程度上是有效的

抱歉。我就是这个意思。

> [@MichaIng](#):
>
> 现在我们只需要将所有 `/phpbb/`（我们旧的论坛路径）重定向到 `/forum/` 在网络服务器上

不。只需为该路径创建一个规范化即可。

---

<div class="post-metadata">

### Author: ![MichaIng](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michaing/32/251089_2.png) [@MichaIng](https://meta.discourse.org/u/MichaIng)
#### Post date: [2025年九月4日 12:23 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/809 "2025-09-04T12:23:55Z")

</div>

> [@pfaffman](#):
>
> 不。只需为此路径进行规范化即可。

这行不通，因为 Discourse 位于 `/forum` 目录下，并且无法处理发往 `/phpbb` 的请求。由于 Discourse 位于子路径下，与要导入的先前论坛软件的路径不匹配，因此别无选择，只能进行重定向（或在代理之前进行重写）到 Discourse 路径，以便其规范化生效。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年九月4日 12:40 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/810 "2025-09-04T12:40:35Z")

</div>

> [@MichaIng](#):
>
> 那不起作用，因为 Discourse 位于 `/forum`

对了。我错过了。您需要将 `/phpbb` 重定向到 `/forum`，并且可能仍然需要处理规范化。

---

<div class="post-metadata">

### Author: ![MichaIng](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michaing/32/251089_2.png) [@MichaIng](https://meta.discourse.org/u/MichaIng)
#### Post date: [2025年九月4日 12:54 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/811 "2025-09-04T12:54:49Z")

</div>

好的，但这确实不难：`/^forum\\/(view.*)/\\1` 对我们旧的 phpBB 永久链接来说效果非常好。不确定是否取决于设置，导入插件生成的永久链接除了 `viewforum.php` 和 `viewtopic.php` 之外还有其他链接，比如用户个人资料链接之类的？

实际上，能够滚动/浏览或排序永久链接会很好，以便更好地了解其中包含哪些 URL 方案。但题外话，在循环搜索模式后，我确信在我们的案例中，只有上面两个存在。

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [2025年九月4日 13:22 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/812 "2025-09-04T13:22:20Z")

</div>

脚本似乎只包含类别、主题和帖子的固定链接。

如果你想创建用户固定链接，并且旧系统中的用户配置文件包含用户 import\_id，那么你可以在控制台中用一些 Ruby 代码来创建它们。

---

<div class="post-metadata">

### Author: ![MichaIng](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/michaing/32/251089_2.png) [@MichaIng](https://meta.discourse.org/u/MichaIng)
#### Post date: [2025年九月4日 13:38 UTC](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810/813 "2025-09-04T13:38:09Z")

</div>

> [@pfaffman](#):
>
> 看起来该脚本仅处理分类、主题和帖子的固定链接。

很高兴知道。主题和帖子网址使用相同的 PHP 脚本。因此，为了排除任何意外的规范化，我的正则表达式可以分为两个：

1. `/^forum\\/(viewforum.php\\?.*)/\\1` 用于分类
2. `/^forum\\/(viewtopic.php\\?.*)/\\1` 用于主题和帖子

… 或者 `/^forum\\/(view(forum|topic).php\\?.*)/\\1`，不确定在性能方面是否有任何细微差别。

个人资料网址无论如何都不太可能获得反向链接。我们使用它来在我们的发布说明中向报告错误或其建议被纳入我们项目的用户致谢。但这种情况很少见，我猜，而且在我们切换到 Discourse 时，我们发布说明中的链接已立即更新。

[上一頁](https://meta.discourse.org/t/migrate-a-phpbb3-forum-to-discourse/30810.md?page=23)
