移行後のパーマリンクの問題

こんにちは、

レガシーな独自開発のフォーラムソフトウェアをDiscourseへ正常に移行することができました。
200万件のレコードを24時間かけてインポートした結果、パーマリンクを除いてすべて問題なく動作しています。

Discourseのpermalinksデータベーステーブルには約35万件のパーマリンクが登録されており、すべて小文字です。例えば「forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html」のようになっています。

残念ながら、Googleは「/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor/」というURLでリンクを張っており、404エラーが発生してしまいます。:frowning:

パーマリンクテーブルを検索する前にリクエストURLを小文字に変換する方法について、他の機能を壊さずに実現できるヒントはありますでしょうか?このような変換を検索前に標準的に行うべきではないでしょうか。

素晴らしいソフトウェアをありがとうございます!

Göks

ようこそ!ここまで来られたことをおめでとうございます!

スラッグを削除し、フォーラムIDのみを含むパーマリンクを作成する正規化ルールを作りたいと考えているのですね。

正しいトピックを特定するために必要なものは「t140842-s1」だけでよろしいでしょうか?

そのように動作する他のインポーターもいくつかありますが、具体的にどれかは確信が持てません。もしかしたらvBulletinかもしれません。しかし、正規化に関連する処理をすべてgrepで検索すれば、私の例が見つかるはずです。

「いいね!」 1

お早いご返信ありがとうございます。

移行前は、ルックアップが大文字小文字を区別するとは知りませんでした。もし知っていたら、その点を考慮して、URL が旧ソフトウェアと同じ形式で保存されるようにしていたはずです。

しかし、現在は移行が完了し、サイトは運用中です。そのため、残念ながら回避策を探しています。

トピックは ID で特定できるので、「/forum/t140842」だけで十分です。SQL を使って permalinks テーブルの url フィールドを修正することは可能ですが、それでもルックアップやリダイレクトは機能するでしょうか?早速テストしてみましたが、機能しませんでした。

Discourse の設定には「パーマリンクの正規化」オプションがありますが、これが何をするものなのか理解できていません。

パーマリンクの正規化は、パーマリンクに一致する前に URL を書き換えるため、スラッグを削除するために使用できます。設定におけるその説明は、すでに理解している場合にのみ役立つかもしれません。:man_shrugging:

古いトピック ID は topicCustomField にあるはずです。したがって、それらをループ処理して新しいパーマリンクを作成できます。その後、古いものを削除してください(または、必要なパーマリンクを作成できると確信したら、すべてを削除してください)。

例を見つけるには、ここでまたは他のインポーターで「permalink」および「normalization」を検索してください(grep -r がその方法の一つです)。さらに助けが必要で予算がある場合、来週お手伝いできます。

「いいね!」 1

さて、このリクエストがあります。

https://a3-freunde.de/forum/t140842/8P-Hilfe-bei-1-8-tfsi-guter-Motor-oder-schlechter-Motor

そして、設定には以下のようなパーマリンク正規化が必要です。

/t(\\d*)/?$forum/t\\1

これにより、上記のリクエストに対して「forum/t140842」が生成されるはずです。

しかし、「forum/t140842」を Discourse のパーマリンクテーブルに追加しても、何も効果がありません。

私の前提は正しいでしょうか?何が不足しているのでしょうか?

いい線いってますね。正規表現の処理って結構手間がかかりますからね。パーマリンクの先頭に forum/ が必要だと思いますよ。

お疲れ様です。感謝いたします。

設定において、私の正規表現を以下のように変更しました(私の意図では、トピック ID もマッチするはずです)。

forum/t(\\d*)/?$forum/t\\1

URL が “forum/t140842” の新しいパーマリンクをテーブルに追加して保存すると、Discourse は URL を “f?$forum/t140842” に変更してしまいます。バグなのか、それともここでいう概念を理解できていないのか、どちらかでしょう。

:confused:

正規表現による正規化をさらに試みましたが、その仕組みを理解することができませんでした。
説明にある例を使用すると、新しいパーマリンクを追加する際に URL フィールドで再び予期しない結果が生じてしまいました。

Discourse へ移行する際に、ドメインの「www」プレフィックスを削除しました。
これにより、旧サーバーで Apache 設定と .htaccess を通じて、リダイレクト前に URI を小文字に変換して書き換える機会が得られました。この方法で一時的に問題は解決しました。

期待通りに動作しませんでした。これは、移行スクリプトで生成された URL のスラグ部分が、旧ソフトウェアのものとはわずかに異なっていたためです。

そのため、自分で URL を「正規化」しました。

正規化された URL の追加/生成(Discourse Permalinks テーブル)

以下の URL 形式から取得した url フィールドを、旧トピックの ID のみを含む単純な URL へ変換します。

forum/t140842-s1/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

または

forum/t140842-s2/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

または

forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html

forum/t140842

これは、REGEXP_REPLACE 関数を使用して URL を書き換える SQL コマンドによって実行されます。

INSERT INTO permalinks (created_at, updated_at, topic_id, url) SELECT NOW(), NOW(), topic_id, REGEXP_REPLACE(url,'forum/t(\\d*)(-?.*)/(.*)','forum/t\\1','') url FROM permalinks WHERE topic_id > 0 ON CONFLICT DO NOTHING;

旧ドメインの .htaccess による旧リクエストの書き換え

RewriteRule ^forum/t([0-9]*)(-?.*)/(.*)$ https://discourse-domain.com/forum/t$1 [R=301,L]

ここで何が起こっているのでしょうか?

Google は https://old-domain.com/forum/t140842/8p-hilfe-bei-1-8-tfsi-guter-motor-oder-schlechter-motor.html という URL をインデックス登録し、リンクを張っています。幸運なことに、このリクエストは異なるドメインであるため Apache サーバーに到達し、.htaccess を使って簡単に書き換えることができました。そのため、このリクエストを https://discourse-domain.com/forum/t140842 へ書き換えています。permalinks テーブルには、上記の正規表現を使用して、完全なスラグ付き URL を持つ既に追加されたパーマリンクから forum/t140842 レコードを追加しました。

これが誰かの出発点になれば幸いです。

「いいね!」 1