このリファレンスは、Discourseのパーマリンクが古いURLパスを新しい宛先にどのようにリダイレクトするか、パーマリンクの正規化がどのように機能するか、そして移行やURL構造変更後にリダイレクトをテストおよびトラブルシューティングする方法を説明します。
必要なユーザーレベル: 管理者
コンソールへのアクセスは、インポーター、スクリプト、またはRailsコンソールからパーマリンクを作成する場合のみ必要です
他のフォーラムから移行するか、サイトのURL構造を変更すると、検索エンジン、ブックマーク、メール、または他のウェブサイトからの古いリンクが正しいページを指さない場合があります。
パーマリンクを使用すると、301 Moved Permanently(恒久的に移動)リダイレクトを使用して、古いURLパスを新しい宛先にリダイレクトできます。
パーマリンクは正確なパスのマッピングです。例えば、この古いURLが機能しなくなった場合:
https://discourse.example.com/forum/topic/123
新しいトピックにリダイレクトするようにパーマリンクを作成できます:
https://discourse.example.com/t/welcome-to-our-community/456
パーマリンクとは
パーマリンクは、1つの古いURLパスから1つの新しい宛先への正確なマッピングです。
例えば:
forum/topic/123 → /t/welcome-to-our-community/456
パーマリンクは以下の場合に役立ちます:
- 他のフォーラムプラットフォームから移行した
- 古いリンクが検索エンジンにインデックスされている
- 古いリンクがメール、ドキュメント、または他のウェブサイトで使用されている
- サイトのURL構造を変更した
- 古いパスをトピック、投稿、カテゴリ、タグ、ユーザー、または外部URLにリダイレクトしたい
各パーマリンクURLは1つの宛先にマッピングされます。
パーマリンクは完全一致です。パーマリンクURLフィールドはワイルドカードや正規表現をサポートしていません。多くの古いURLが予測可能なパターンに従っている場合は、正確なパーマリンク検索の前に着信URLを変換するためにパーマリンク正規化を使用してください。
パーマリンクと正規化
パーマリンクと正規化は異なることを実行します:
| 機能 | 実行内容 | 例 |
|---|---|---|
| パーマリンク | 保存された1つの古いパスを1つの宛先にリダイレクト | old/topic/123 → Topic 456 |
| 正規化 | パーマリンク検索の前に着信パスを変更 | old/topic/123-title → old/topic/123 |
正規化自体はリダイレクトしません。保存されたパーマリンクを検索するために使用されるパスを変更するだけです。
正規化を適用した後でも、一致するパーマリンクが必要です。
簡単な例
古いトピックURLのリダイレクト
古いURL:
https://discourse.example.com/forum/topic/123
パーマリンクURL:
forum/topic/123
宛先の種類:
トピック
宛先:
456
結果:
/forum/topic/123 → /t/welcome-to-our-community/456
クエリ文字列を含む古いURLのリダイレクト
古いURL:
https://discourse.example.com/viewtopic.php?t=123
パーマリンクURL:
viewtopic.php?t=123
宛先の種類:
トピック
宛先:
456
結果:
/viewtopic.php?t=123 → /t/welcome-to-our-community/456
同じパターンを持つ多くの古いURLのリダイレクト
古いURL:
/forum/support/123-how-do-i-reset-my-password.html
/forum/general/456-how-do-i-change-my-email.html
検索の前にそれらを簡略化するために正規化を使用できます:
/forum/support/123-how-do-i-reset-my-password.html → forum/123
/forum/general/456-how-do-i-change-my-email.html → forum/456
その後、正確なパーマリンクを作成します:
forum/123 → Topic 1001
forum/456 → Topic 1002
パーマリンクURLとして入力する内容
古いパスを入力します。完全なURLではありません。
例えば、以下を使用します:
forum/topic/123
または:
/forum/topic/123
完全な古いURLは使用しないでください:
https://discourse.example.com/forum/topic/123
先頭のスラッシュは受け入れられますが、パーマリンクが保存されるときに削除されます。これら2つのエントリは同等です:
/forum/topic/123
forum/topic/123
両方とも以下として保存されます:
forum/topic/123
先頭および末尾の空白は、パーマリンクが保存されるときに削除されます。
クエリ文字列は一致の一部です
パーマリンクは、クエリ文字列を含む完全なリクエストパスに一致します。
つまり、これら2つのURLは異なるパーマリンクの一致です:
/old/topic/123
/old/topic/123?utm_source=example
古いURLにクエリ文字列がある場合、次のいずれかを行います:
- クエリ文字列を含むパーマリンクを作成する、または
- 一致する前にクエリ文字列を削除または簡略化するためにパーマリンク正規化を使用する
ほとんどの分析または追跡パラメータの場合、多数の個別のパーマリンクを作成するよりも、正規化を使用する方が通常は優れています。
例えば、この保存されたパーマリンク:
docs/123
これは、検索の前に正規化がクエリ文字列を削除しない限り、必ずしもこのリクエストされたURLに一致するわけではありません:
/docs/123?utm_source=newsletter
分析ツール、検索コンソールのレポート、ブラウザ、またはメールキャンペーンから古いURLをコピーする際は、追跡パラメータが追加されているかどうかを確認してください。
URLフラグメントは一致の一部ではありません
URLフラグメントはサーバーに送信されません。
例えば、このURL:
/old/topic#post-12
サーバーには以下として届きます:
/old/topic
パーマリンクまたは正規化は、実際のリクエストで#が%23としてエンコードされていない限り、以下に一致できません:
#post-12
サポートされているパーマリンクの宛先
パーマリンクは、以下の宛先の種類の一つにリダイレクトできます:
- トピック
- 投稿
- カテゴリ
- タグ
- ユーザー
- 外部または相対URL
外部または相対URLの宛先は、以下のようなリダイレクトに使用できます:
old/privacy-policy → https://archive.discourse.example.com/privacy
または:
old/preferences → /my/preferences
外部URLの宛先は慎重に使用してください。これらは訪問者をサイトからリダイレクトし、ターゲットURLが存在するかどうかを確認しません。
移行されたトピック、投稿、カテゴリ、タグ、またはユーザーへのリダイレクトには、内部宛先の種類を優先してください。ターゲットページが内部オブジェクトで表されていない場合にのみ、外部URLの宛先を使用してください。
パーマリンクを手動で追加する
パーマリンクを手動で追加するには:
/admin/config/permalinksに移動します。- パーマリンク タブを選択します。
- パーマリンクを追加 をクリックします。
- URL フィールドに古いパスを入力します。
- パーマリンクの種類 を選択します。
- 宛先を入力または選択します。
- パーマリンクを保存します。
- ブラウザまたは
curlを使用して古いURLをテストします。
例:
URL:
forum/topic/123
パーマリンクの種類:
トピック
宛先:
456
次のリクエスト:
https://discourse.example.com/forum/topic/123
はトピック456にリダイレクトされます。
宛先の値
宛先の値はパーマリンクの種類によって異なります。
| パーマリンクの種類 | 宛先 |
|---|---|
| トピック | トピック |
| 投稿 | 投稿 |
| カテゴリ | カテゴリ |
| タグ | タグ |
| ユーザー | ユーザー |
| 外部または相対URL | 完全な外部URLまたは相対パス |
例:
forum/topic/123 → Topic 456
forum/post/789 → Post 789
forum/category/support → Category support
forum/tag/example → Tag example
forum/user/alice → User alice
old/privacy → https://archive.discourse.example.com/privacy
old/preferences → /my/preferences
移行中にパーマリンクを作成する
多くの公式インポーターは、移行されたカテゴリ、トピック、投稿、またはユーザーのためにパーマリンクを自動的に作成します。
大規模な移行の場合、パーマリンクは通常、インポーターまたは移行スクリプトによって作成され、1つずつ手動で入力されることはありません。
カスタムインポーターを作成している場合は、移行後も機能し続ける必要がある古いURLのパーマリンクレコードを作成してください。
例えば:
Permalink.create!(url: "discussion/12345", topic_id: 987)
この例では、discussion/12345は古いパスであり、987はDiscourseのトピックIDです。
先頭のスラッシュも受け入れられます:
Permalink.create!(url: "/discussion/12345", topic_id: 987)
両方の例は、パーマリンクURLを以下として保存します:
discussion/12345
外部URLにリダイレクトするには:
Permalink.create!(
url: "discussion/12345",
external_url: "https://archive.discourse.example.com/discussion/12345"
)
インポーターでパーマリンクを作成する場合:
- 完全な古いドメインではなく、古いパスを保存する
- 一致に必要でない限り、クエリ文字列を含めない
- 各古いパスが1つの宛先にマッピングされることを確認する
- レコードを挿入する前に重複を確認する
- パーマリンクURLは一意でなければならないことを忘れないでください
複数のテスト移行を実行する場合、最終的なトピックおよび投稿IDは実行間で変更される可能性があります。本番環境の移行データが安定したときに、最終的なパーマリンクマッピングを生成または確認してください。
パーマリンク正規化とは
パーマリンク正規化は、一致するパーマリンクを検索する前に、着信の古いパスを変更します。
正規化は、多くの古いURLが同じ予測可能なパターンに従っている場合に役立ちます。
例えば、古いフォーラムがこのようなURLを使用していたとします:
/forum/support/123-how-do-i-reset-my-password.html
しかし、保存されたパーマリンクはより単純です:
forum/123
正規化は、着信リクエストを保存されたパーマリンクパスに変換できます:
/forum/support/123-how-do-i-reset-my-password.html
↓
forum/123
その後、パーマリンクはリダイレクトできます:
forum/123 → /t/how-do-i-reset-my-password/456
正規化自体はリダイレクトしません。パーマリンク検索に使用されるパスを変更するだけです。
正規化されたパスに一致するパーマリンクが必要です。
ほとんどのサイトはパーマリンク正規化を必要としません。多くの古いURLが予測可能なパターンに従っており、各古いURLに対して1つのパーマリンクを作成するのが非現実的な場合にのみ、それらを使用してください。
パーマリンクと正規化の連携動作
古いURLがリクエストされるときのプロセスは次の通りです:
訪問者が古いURLをリクエスト
↓
設定されている場合、パーマリンク正規化が適用される
↓
結果のパスを使用してパーマリンク検索が実行される
↓
一致するパーマリンクが存在する場合、訪問者はリダイレクトされる
例えば:
リクエストされたURL:
/old/topic/123?utm_source=newsletter
正規化により変更される:
old/topic/123
パーマリンクによりリダイレクトされる:
/t/new-topic-title/456
パーマリンク正規化を追加する
パーマリンク正規化は、パーマリンク設定から構成されます。
追加するには:
/admin/config/permalinksに移動します。- 設定 タブを選択します。
permalink normalizations設定にルールを追加します。- 設定を保存します。
- 正規化されるべき古いURLをテストします。
- 正規化されたパスが既存のパーマリンクに一致することを確認します。
構文は次の通りです:
/<regex>/<replacement>
複数のルールは|で区切られます。
例えば:
/old\/topic\/(\d+)*/topic/\1
これにより、以下を変換できます:
old/topic/123-my-old-title
以下に:
topic/123
置換はRubyの置換構文を使用するため、キャプチャグループは以下のように書かれます:
\1
\2
\3
重要な正規化ルール
正規化ルールをシンプルに保ってください。
- 正規化はRubyの正規表現を使用します。
- 正規表現部分のリテラル
/文字は\/としてエスケープする必要があります。 - 置換部分のリテラル
/文字はエスケープする必要はありません。 - 複数の正規化ルールは
|で区切られます。 |はルールを区切るため、|を使用した正規表現の代替を避けてください。- 各ルールはグローバル置換ではなく、単一の置換を使用します。
- ルールは順序通りに適用されます。
- 一致するルールは順次適用されます。
- 正規化は、パーマリンク検索の前に適用されます。
- 正規化は、パーマリンクレコードを保存するときにも適用されます。
- 設定バリデータは無効な正規表現を検出しますが、意図した通りに動作しないルールをすべて検出しない場合があります。
警告: 正規化は、パーマリンクレコードが保存されるときに適用されます。管理UIに正規化されていないURLを入力すると、正規化された結果として保存される場合があります。パーマリンクを作成した後に正規化を追加または変更する場合は、慎重にテストし、新しく保存されたパーマリンクURLがどのように保存されるかを確認してください。
正規化の例
余分なタイトルテキストを含む古いURLのリダイレクト
古いURL:
/forum/support/123-how-do-i-reset-my-password.html
/forum/general/456-how-do-i-change-my-email.html
これらをより単純なパーマリンクパスに正規化できます:
forum/123
forum/456
正規化の例:
/forum\/[^\/]+\/(\d+).*/forum/\1
その後、パーマリンクを作成します:
forum/123 → Topic 1001
forum/456 → Topic 1002
追跡クエリ文字列の無視
リクエストされた古いURL:
/docs/123?utm_source=newsletter
保存されたパーマリンク:
docs/123
正規化:
/(docs\/\d+)\?.*/\1
これにより、パーマリンク検索の前にクエリ文字列が削除されます。
重要なクエリパラメータの保持
一部の古いフォーラムは、クエリパラメータを安定したトピック識別子として使用します。
例えば:
viewtopic.php?f=10&t=123
viewtopic.php?t=123
これらを以下に正規化したい場合があります:
viewtopic.php?t=123
正規化の例:
/(viewtopic\.php\?)(?:.*&)?(t=\d+).*/\1\2
その後、パーマリンクを作成します:
viewtopic.php?t=123 → Topic 456
正規表現とワイルドカードのリダイレクト
パーマリンクURLフィールドは正規表現やワイルドカードをサポートしていません。
これはパーマリンクURLとして機能しません:
forum/topic/*
これもパーマリンクURLとして機能しません:
forum/topic/(\d+)
パターンベースの処理が必要な場合は、パーマリンク正規化を使用して、着信URLを正確に保存されたパーマリンクに一致する形式に書き換えてください。
例えば:
/forum/topic/123-title → forum/topic/123
その後、通常の正確なパーマリンクを作成します:
forum/topic/123 → Topic 456
ルート優先度と組み込みパス
パーマリンクルーティングは、通常のアプリケーションルートの後にチェックされます。
つまり、有効な既存のルートは、パーマリンクがチェックされる前に正常に解決される場合があります。
以下のような組み込みパスで始まる古いURLには注意してください:
/t
/c
/u
/tag
/tags
例えば、このような古いフォーラムURLは、組み込みのカテゴリルートのように見える場合があります:
/c/blog/old-platform-url/ba-p/12345
古いURLが有効な既存のルートと競合する場合、有効なルートがパーマリンクよりも優先される可能性があります。
同様に、以下のような既存のトピックルートのように見えるパスのパーマリンクを作成した場合:
t/123
通常のトピックルートがパーマリンク検索の前に処理される場合があります。
いくつかの組み込みの「見つかりません」ルートには追加のフォールバック動作がありますが、それを信頼しないでください。組み込みパスと重複する古いURLは常にテストしてください。
古いトピックURLを別の場所にリダイレクトする必要がある場合、その古いトピックは通常、有効なトピックルートとして解決され続けるべきではありません。
権限とプライベートコンテンツ
内部宛先へのパーマリンクは、通常の権限を尊重します。
パーマリンクがプライベートまたは制限されたトピック、投稿、カテゴリ、タグ、またはユーザーを指している場合、その宛先にアクセスできない訪問者は、リダイレクトの代わりに404を受け取ります。
外部URLへのパーマリンクは、内部コンテンツの権限をチェックしません。
特殊文字とエンコードされたURL
特殊文字を含むURLは慎重にテストしてください。
これには以下が含まれます:
- スペース
+%&':- 括弧
- 非ラテン文字
パーマリンクの一致は、先頭のスラッシュを削除し、構成された正規化を適用した後のエンコードされたリクエストパスを使用します。エンコーディングの違いにより、URLが期待するパーマリンクに一致しない場合があります。
例えば、これらは、古いURLがリクエストおよび保存される方法によっては同等ではない場合があります:
old/topic/hello%20world
old/topic/hello+world
URLの例では、スペースに%20を使用してください。URLパスでは、+はスペースと同じではありません。
&、?、#などの文字にはURL内で特別な意味があります。これらがリテラルなパス文字として意図されている場合、それらはパーセントエンコードされるべきです。
迷った場合は、ユーザーや検索エンジンがリクエストする正確な古いURLをテストしてください。
制限事項
パーマリンクは、古いパスを新しい宛先にリダイレクトするために設計されています。一般的なリダイレクトまたは書き換えエンジンではありません。
重要な制限事項:
- パーマリンクURLは、完全なURLではなく、パスおよびクエリ文字列として保存されます。
- 完全なURLはパスに自動的に変換されません。
- パーマリンクURLは、正規化後に一意でなければなりません。
- パーマリンクURLには1つの宛先しか持てません。
- サポートされている宛先は、トピック、投稿、カテゴリ、タグ、ユーザー、および外部または相対URLに限定されます。
- パーマリンクは
301 Moved Permanentlyを使用します。302のパーマリンクごとのオプションはありません。 - パーマリンクURLフィールドは、ワイルドカードや正規表現をサポートしていません。
- クエリ文字列は検索キーの一部です。
#post-12などのURLフラグメントはサーバーに送信されず、一致できません。- 一致は、リクエストスキームまたはホストを使用しません。
- ネイティブルートは、キャッチオールパーマリンクルートよりも前にチェックされます。
- 内部宛先は権限チェックされます。
- 外部URLの宛先は内部コンテンツの権限チェックをバイパスします。
- パーマリンク正規化はRubyの正規表現を使用します。
- 正規化ルールは
|で区切られるため、|を正規表現の代替として使用しないでください。 - 正規化ルールは、グローバル置換ではなく、ルールごとに単一の置換を使用します。
- 正規化は、検索前およびパーマリンクレコードの保存前に適用されます。
- 設定バリデータは無効な正規表現を検出しますが、意図した通りに動作しないルールをすべて検出しない場合があります。
ほとんどのサイトでは、複雑な正規化ルールよりも単純な1対1のパーマリンクの方が管理が容易です。古いURLが予測可能なパターンに従っている場合にのみ、正規化を使用してください。
古いURLすべてをホームページにリダイレクトしない
すべての古いURLをホームページにリダイレクトしないでください。
各古いURLを最も関連性の高い新しいページにリダイレクトしてください。同等のコンテンツがない場合、ユーザーや検索エンジンを無関係なページに送るよりも、404の方が良い場合があります。
良いリダイレクトは具体的です:
old/topic/123 → 同じ件に関する新しいトピック
悪いリダイレクトは一般的です:
old/topic/123 → ホームページ
old/topic/456 → ホームページ
old/topic/789 → ホームページ
リダイレクトをテストする
パーマリンクまたは正規化を作成した後、古いURLのサンプルをテストしてください。
ブラウザでテストするか、以下を使用できます:
curl -I https://discourse.example.com/forum/topic/123
機能するパーマリンクリダイレクトは、以下のような恒久的なリダイレクトを返すはずです:
HTTP/2 301
location: https://discourse.example.com/t/welcome-to-our-community/456
各古いURLのパターンからのテスト例をテストしてください。以下を含みます:
- 古いトピックURL
- 古いカテゴリURL
- 古い投稿URL
- クエリ文字列を含むURL
- 特殊文字を含むURL
- 検索結果からのURL
- 古いメールやドキュメントからのURL
/t、/c、または/uなどの組み込みパスで始まるURL- 外部URLリダイレクト
トラブルシューティング
古いURLがリダイレクトしない場合は、次の一般的な原因を確認してください:
- パーマリンクが存在することを確認します。
- パーマリンクURLが完全な古いドメインではなく、古いパスであることを確認します。
- 古いURLにクエリ文字列が含まれているかどうかを確認します。
- 正規化を使用している場合、正規化されたパスが保存されたパーマリンクに一致することを確認します。
- 組み込みルートが優先されているかどうかを確認します。
- 宛先がプライベートまたは制限されているかどうかを確認します。
%20と+などのエンコーディングの違いを確認します。- パーマリンクが保存されるときに正規化がURLを変更したかどうかを確認します。
- コンテンツが移行されたことを確認します。
- ブラウザまたは
curl -Iを使用して、正確な古いURLでテストします。
最も一般的な問題は次の通りです:
- 古いパスではなく、完全な古いURLを入力する
- 欠落しているまたは予期しないクエリ文字列
- パーマリンクURLフィールドでワイルドカードや正規表現が機能することを期待する
- 組み込みパスと古いURLが重複する
- プライベートまたは制限された宛先
- エンコーディングの違い
- 正規化が予期せずにパスを変更する
SEOに関する注意事項
移行後、検索エンジンは古いURLがリダイレクトされていると報告する場合があります。これらの古いURLが正しい新しいページにリダイレクトされる場合、これは予想される動作です。
最適な結果を得るために:
- 古いURLを関連する新しいページにリダイレクトする
- 不要なリダイレクトチェーンを避ける
- 多くの無関係なURLをホームページにリダイレクトしない
- ユーザーや検索エンジンが更新できるよう、リダイレクトを十分な期間維持する
- 古いサイトマップ、分析、または検索コンソールデータからの重要なURLをテストする