Discourse の投稿にユーザーが埋め込む動画や音声ファイルなどをホストできるように、Discourse を実行する Nginx と並行して Apache サーバーをセットアップしました。Apache サーバーは http: 用にポート 8008、https: 用にポート 591 (IANA ポートは http-alt 用に予約済み) で実行されます。これは正常に機能し、URL にポート番号を指定することで、ブラウザからサーバー上のコンテンツにアクセスできます。たとえば次のようになります。
https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4
しかし、この URL を Discourse の投稿に埋め込もうとすると、次のエラーが発生します。
申し訳ありませんが、サーバー ‘scanalyst.fourmilab.ch’ が見つからなかったため、この Web ページのプレビューを生成できませんでした。プレビューの代わりに、投稿にはリンクのみが表示されます。
tcpdump を実行して DNS トラフィックを監視すると、この URL が拒否されたときに何も送信されていないことがわかります。DNS クエリをまったく行わずに拒否しています。URL のポート番号を 443 (https: のデフォルト) に変更すると、DNS クエリは正常に行われますが、Apache サーバーはそのポートでリッスンしておらず、Discourse サーバーは URL を処理する方法を知らないため、当然ながら埋め込みは失敗します。Discourse のドキュメントには、埋め込み URL でポート番号を指定できないことを示すものは何も見つかりませんでした。
ソース コードを調べたところ、lib/final_destination.rb の 362 行目の validate_uri_format 関数に次のテストがあることがわかりました。
return false if @uri.scheme == 'https' && @uri.port != 443
これは 443 以外のポートを使用する https: URL を拒否するように見えます。これは私が目にしていることを説明しているように思えたので、この行をコメントアウトしましたが、Discourse を再起動してもまったく効果はありませんでした。投稿がサイトに表示され、埋め込みがテキストリンクに変換されると、テキストリンクをクリックするとビデオが正しく表示されるため、唯一の問題は埋め込みとして認識されず、インラインプレーヤーがその周りにラップされないことです。
私の質問は次のとおりです。
- Discourse の投稿の埋め込み用 URL で、標準以外のポート番号は機能することが意図されていますか?
- もしそうなら、これらの URL が拒否される原因は何ですか?
- それらを機能させる方法はありますか?
2017 年 3 月に、これらの 2 つの投稿でこの問題について議論がありました。
- Specifying port for embeddable host given an IP results in error
- FIX: Allow ports for embed host IPs #4759 (GitHub)
これらは問題が修正されたことを示唆していましたが、2.9.0.beta10 では今日機能しません。
洞察や/またはこの件に関する支援があれば幸いです。