Redirect old forum URLs to new Discourse URLs using permalinks

既存フォーラムのURLをパーマリンクを使用して新しいDiscourseのURLにリダイレクトする

他のフォーラムソフトウェアからインポートスクリプトのいずれかを使用してDiscourseに移行した場合、苦労して獲得したGoogle検索結果が引き続き同じコンテンツを指すようにしたいはずです。Discourseには、パーマリンクルックアップテーブルを使用してこれを処理するための組み込みの方法があります。

パーマリンクテーブルでは、一致させるURLと、そのURLが何を表示すべきかの2つの設定が可能です。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は、トピックID 12345の正しいURLにHTTPレスポンスステータスコード301(恒久的に移動)でリダイレクトを実行します。301により、検索エンジンはレコードを更新し、新しいURLの使用を開始するはずです。

Discourseから離れたURLにリダイレクトしたい場合は、external_url を設定することで可能です。

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

追加情報

サブカテゴリのIDを見つけるには、スラグで次のように検索できます。

Category.find_by_slug('products').id

そのURLのパーマリンクを削除するには、次のようにします。

Permalink.find_by_url("/blah").destroy

URLごとに1つのパーマリンクレコードしか存在できないため、URLで検索するだけです。

MyBBからDiscourseへのトピックマップの作成

DiscourseからWordPressへのリダイレクトに関する質問

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

パーマリンク正規化


最終レビュー:@SaraDev on 2022-06-03T20:00:00Z

「いいね!」 37

リライトルールをDiscourse Dockerクラスターに直接保存することは可能ですか?HTTPとSSLを処理するWebサーバーがありますが、そこに何かを追加できますか?

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

nginxが新しいトピックIDを知らないので、それがどう機能するか分かりません。/threads IDをDiscourseのトピックIDに変換する必要があります。

/threads/name.1234と呼び出すと、/t/nameに書き換えられ、正しい投稿が表示されます。IDはその時点では使用されていません。テストしました。

おそらく、Discourse と古いフォーラムが同じスラッグを生成した場合(かつスラッグが数字で始まらない場合)にのみ機能するでしょうが、それでも十分でしょう。

提案されているように 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 分節約できます)。nginx は sv restart nginx で再起動できます。

上記のいずれもテストされていませんが、近いものになるはずです。

「いいね!」 1

ご協力ありがとうございます。nginxの設定を調整したところ、期待どおりに動作しました。

「いいね!」 1

nginx が自動的に調整されるように、app.yml のどこにこれを記述する必要がありますか?カスタムコマンドの実行エリアですか?

なぜなら、これを追加すると (\u003cunknown\u003e): クォートされたスカラーの解析中に不明なエスケープ文字が見つかりました となるからです。

  - 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;
      }"

複数のドメイン/リダイレクトでLet’s Encryptを設定するを見て、その例でNginx設定に追加されているものと同じようなものを使用してください。

そこにあるように、追加するであろう after_ssl フックに入れることができます。

まだ同じエラーが発生しています。フォーマットの問題だと思います。

「いいね!」 1