RGJ
(Richard - Communiteq)
1
あるクライアントが、安全なメディアアップロードで問題を起こしています。
このクライアントは、公式インストール版の Docker ベースの Discourse を、AWS S3 と安全なメディアの有効化とともに運用しています。
フォーラムには多数の MP3 および M4A 音声ファイルがあります。
Discourse は、以下のように優れたプレイヤーを自動的に埋め込みます。

問題点:音声ファイルが信頼性高く動作しません。再生されないことがあります。
100% 確実に再現することはできませんが、キャッシュの影響ではないかと考えています。再生ボタンが押されるまでダウンロードが遅延しているように見えます。これは論理的で良い仕組みのように思えます。
しかし、安全なメディアアップロードとうまく連携しません。ページを開いたまま数分後に再生ボタンを押すと、音声ファイルが(常に)再生されません。その時点で AWS から 403 Expired エラーが返されます。リクエストがファイルが要求された時点ではなく、それ以前に署名されているようです。エラーメッセージには、リクエストが過去に期限切れになったと明確に記されています。
この遅延が原因ではないかと推測していますが、100% 確信はありません。事実として、これは音声ファイルにのみ発生しており(埋め込まれた画像は常に即時にダウンロードされるため、発生しません)。
はい、サーバーの時刻は正確です。
最新のベータ版を実行する新規インストールでも再現可能です。トピックに 2 つの音声ファイルを入れて、少し操作してみてください。
「いいね!」 2
Falco
(Falco)
2
それは、ブラウザが audio タグや video タグとどのように連携するか、および preload のデフォルト値によるものかもしれません。ファイルは特に長いのでしょうか?私の知る限り、ブラウザは必要に応じてバイト範囲を使ってダウンロードを行います。
「いいね!」 4
RGJ
(Richard - Communiteq)
3
いいえ、ファイルは長くありません。サイズは数(5)メガバイト未満で、範囲指定されたダウンロードは行われていません。
「preload のデフォルト値」とはどういう意味でしょうか?
Falco
(Falco)
5
<audio> または <video> タグがある場合、そのタグに preload=auto という属性を設定すると、ブラウザにページ読み込み時にすべてをダウンロードするようヒントが出されます。そのため、署名付き S3 URL の有効期限切れによる問題は発生しません。
これらに関しては常に言えることですが、サイトがこの属性を濫用し始めたため、現在では常に無条件に守られるわけではありません。ただし、ブラウザが考慮するヒントではあります。
「いいね!」 6
RGJ
(Richard - Communiteq)
6
明示的な <audio> タグはありません。オーディオファイルが挿入されると、Discourse によって自動的に生成されます。preload 属性はありません。
私が理解できない部分:/secure-media-uploads ルートが署名付き URL を生成しているなら、ページ読み込みからルートが呼び出されるまでの時間がどれくらいかはどうして問題になるのでしょうか?結局のところ、署名付きルートを生成してから、そのルートに直ちにリダイレクトしているはずです。しかし、何らかの理由で時間が関係しているようです。何かキャッシュされているのでしょうか?
Falco
(Falco)
7
ポストの Markdown から生成された HTML には存在します。私が言っているのはその点です。設定が有効になっている場合、その属性を追加するのは理にかなっていると思います。
この機能の目的全体がまさにそれにあると考えています。アップロードに対して他の場所で共有できない URL を持つことです。そのためには、有効期限が切れる URL を使用することしか方法がありません。
「いいね!」 5
RGJ
(Richard - Communiteq)
9
はい、その点は理解しています。そして、有効期限のタイマーは、ページが読み込まれた時点ではなく、/secure-media-uploads ルートが呼び出された瞬間から始まります。
それでも、ページがロードされてからルートがアクセスされるまでの時間が長いと、何らかの理由で問題が発生しているように見えます。なぜそのようなことが起こるのか、私には理解できません。
martin
(Martin Brennan)
17
この問題は、こちらで修正されました FIX: Disable preloading audio + video when secure media enabled (#8922) · discourse/discourse@7ff58f1 · GitHub @RGJ。問題の原因は、ブラウザがファイルのメタデータ(例:再生時間)を取得するために、オーディオおよびビデオファイルに対して初期リクエストを送信する点にありました。しかし、セキュアなプレサインドURLを使用しているため、この初期リクエストが15秒の有効期限のカウントダウンを開始してしまい、その時間経過後にユーザーがオーディオやビデオを再生しようとすると、AWSから403エラーが返されていたのです。
現在、セキュアメディアが有効な場合、ビデオおよびオーディオのプリロードを無効化するように変更しました。既存の投稿にあるオーディオやビデオについては、変更を反映させるためにHTMLを再構築する必要があります。
「いいね!」 13