前回のアップデートでカテゴリのパーマリンクが壊れる

最後のアップデートでカテゴリのパーマリンクが壊れています。トピックのパーマリンクは正常に機能しています。
例えば、category/11562 は c/11562 にリダイレクトされますが、これは正しくありません。正しく設定されているリダイレクト先は c/general/4 または c/4 であるべきです。
どなたかこの問題の解決にご協力いただけますでしょうか?

category/11562 用のパーマリンクを作成しましたが、以前は general にリダイレクトされていたものが、現在は壊れていますか?

「いいね!」 1

どのアップデートブランチからですか?

はい、以前は正常に動作していました。その後、以下に更新しました。

<meta name="generator" content="Discourse 3.3.0.beta1-dev - https://github.com/discourse/discourse version 0bb492c6b6b79389a12b277b9d25b99e75f2625d">

DBを完全にクリーンアップして、他のフォーラムデータをゼロから再インポートしましたが、現在は動作していません。

これが問題だと思います。なぜなら、今朝のテストでは再現できなかったからです。

パーマリンクがデータベースにまだ存在し、正しい場所を指しているかどうか確認してもらえますか?

「いいね!」 3

新しいインポートでパーマリンクを再度追加しました。これはインポートスクリプトによって行われます。しかし、ウェブを使用して手動で追加しようとしました。ウェブのスクリーンショットとDBの結果を添付します。何か見落としているかもしれません。

申し訳ありませんが、1回の投稿につきスクリーンショットは1枚のみ許可されています

パーマリンクが /category/11562 ではなく /forum/category/11562 になっています。

推測ですが、途中でパーマリンクの正規化が失われたのではないでしょうか。

「いいね!」 3

https://preview.vaadin.com/forum/category/11562 へのレスポンスを確認しても、理解できません。

https://preview.vaadin.com/forum/c/11562 という Location を持つ 302 を受け取ります。

一方、トピックについては、例えば:
https://preview.vaadin.com/forum/thread/851770

Location: https://preview.vaadin.com/forum/t/tabsheet-tabs-not-displaying-properly-in-ie8-after-upgrade-to-6-7-1/173931 を持つ 301 を受け取ります。

Discourse が両方を等しく処理することを期待していますが、ご覧のとおり、どちらも /forum/ セグメントを保持しています。

「いいね!」 1

あなたのフォーラム全体がサブフォルダインストールであるという事実に言及しませんでしたね。

「いいね!」 4

もう少し詳しく調べたのですが、これがどのように機能したのか理解できません。category/ は常に categories#redirect ルートをトリガーし、これは最近変更されていません。

get "category/*path" => "categories#redirect"

編集:以下の投稿は、以前は機能していたことを示しています。

「いいね!」 1

はい。サブフォルダーインストールでパーマリンクとパーマリンク正規化がどのように機能するか、想像もつきません。

そして、それは常にサブフォルダーインストールでしたか?

インポートスクリプトを再実行したときに、他に何も変更されませんでしたか?

スクリプトに何らかの違いがある可能性が最も高いと思われます。

待ってください。https://meta.discourse.org/category/67Announcements - Discourse Meta にリダイレクトされます。つまり…いいえ、しかしパーマリンクがその /category リダイレクトをオーバーライドすることを示す仕様があり、それは4〜5年前のものです。

ですから、何が起こっているのかを理解するために、手動でカテゴリリダイレクトを作成すると思います(例:「/category/mycategory」や数字を含まない他のものなど)。

「いいね!」 2

@pfaffman さん、良い発見ですね。そのテストがあれば、実際に機能したはずです。

「いいね!」 1

そんなことが可能だとは知りませんでした!

はい、とても便利です。Serve Discourse from a subfolder (path prefix) instead of a subdomain を参照してください。

「いいね!」 4

回答ありがとうございました!

興味深いことに、カテゴリのパーマリンクは、元のURLに /category/ という名前のパスがない場合にのみサブフォルダーから機能することがわかりました。@pfaffman が回答で言及したように。たとえば、/forum/category_foo/123 は目的の一般カテゴリに正しくリダイレクトされます。
Discourse は /category/ をキャプチャし、/c/ にオーバーライドします。
したがって、これは非常に簡単に解決できます。
古い category/11562 からのredirectである /c/11562 を、カテゴリ General /c/4 に追加します。

そして、おっしゃる通り、最初のインストールはサブフォルダーなしでしたが、2番目はサブフォルダーがあり、これが3番目です。テストしたところ、最初の2回は機能していたと思います。2番目と3番目の間での唯一の変更点は、1番目と2番目の間でDBをクリーンアップしなかったことです。そして3番目は、Dockerの外にある新しいDBでのクリーンインストールでした(Discourse v3へのアップグレードとは別に)。したがって、Discourse v3ベータ版で何かが変更されたのではないかと疑っています。そうでなければ、サブフォルダーがなくても、なぜそれが機能したのでしょうか?

「いいね!」 1

こちらが回答です

もし私の理解が正しければ、Discourseは、ルートにセグメントがある場合にのみ/category/から/c/へのリダイレクトを適用するということですね。

それにもかかわらず、あなたのフォーラムを例にとると:https://meta.discourse.org/で、https://meta.discourse.org/category/1と入力すると、https://meta.discourse.org/c/bug/1にリダイレクトされます。

これは私たちのインストールでも経験していることと同じで、あなたのサイトでも/category/#old_numberから/c/#real_categoryへのリダイレクトは不可能で、常に/c/#old_numberにたどり着くことになります。