Mir ist gerade aufgefallen, dass Discourse für mehrere Dateitypen falsche Content-Type-Header setzt: mp4-Dateien von /uploads/ haben content-type: application/mp4 statt video/mp4
Meine Uploads kamen von S3, also liegt es am S3-Hosting-Anbieter.
Einige JavaScript-Dateien (.js) z. B. von /brotli_asset/ haben application/javascript statt text/javascript.
Ich verwende discourse_docker ohne Modifikationen. Ich habe das enthaltene Nginx überprüft, es enthält die korrekte Konfigurationsdatei für MIME-Typen. Es scheint, dass das Discourse-Backend für das Senden dieser falschen MIME-Typen verantwortlich ist.
Hallo! Soweit ich das Problem mit Uploads verstanden habe, lag es auf meiner Seite und wurde vom S3-Anbieter verursacht (ich habe es erfolgreich behoben, indem ich die Einstellung in meinem Nginx überschrieben habe). Und das Problem mit JS von /brotli_asset/ liegt irgendwo im „internen“ Nginx von Discourse, also scheint es ein Fehler in discourse_docker zu sein.
Schade für mich, aber ich konnte keinen besseren Ort finden, um einen Fehler zu melden, als diesen Teil des Forums. Können Sie mir bitte weiterhelfen?
Kurz gesagt, Discourse sendet JavaScript von verschiedenen Orten mit unterschiedlichen MIME-Typen. Z.B. /theme-javascripts/ff3c633d0d4192c83a194066eaa9d823b5c2d8f6.js wird mit text/javascript (korrekt) gesendet und das zuvor erwähnte /brotli_asset/… mit application/javascript. Dies kann Proxy-Server zwischen Discourse und dem Client sowie Analysetools verwirren, wo ich das Problem bemerkt habe.
Es scheint, dass Sie nur den internen Nginx im Discourse-Docker-Image für Brotli-Assets korrekt einrichten müssen.
In meinen GoAccess-Berichten wird das Mime-Types-Dashboard von Discourse in JS in zwei Werte aufgeteilt: einen für text/javascript und einen für application/javascript.
Der zweite Wert: Sowohl die Direktiven gzip_types als auch brotli_types in Nginx werden von Mime-Types betrieben. Daher müssen Discourse-Benutzer sowohl das korrekte text/javascript als auch das inkorrekte application/javascript einrichten.
Dasselbe gilt für jeden Proxy, der Inhalte neu komprimiert und dabei auf Mime-Types basiert.
Beim Laden der Video-URL sind die Header zwischen einer regulären Installation und einer Entwicklungsinstallation unterschiedlich.
Bei der regulären Produktionsinstallation ist der Video-Content-Type auf application/mp4 gesetzt, während er bei einer Entwicklungsinstallation auf video/mp4 gesetzt ist.
Crossposting Discourse send PDF inline, da der Autor ein ähnliches unerwünschtes Verhalten bei PDFs behoben hat.
Ich bin ganz Ohr, wenn jemand eine Lösung hat, um zu verhindern, dass mp4s zwangsweise heruntergeladen werden.
Bei der weiteren Untersuchung unserer S3-Uploader-Implementierung stelle ich jedoch fest, dass wir für fast jeden Upload, der keine Bilddatei ist, den Content-Disposition-Header \"attachment\" hinzufügen, obwohl er anscheinend nur für SVGs gedacht war. Die Verwendung von \"attachment\" würde dazu führen, dass der Inhalt heruntergeladen und nicht in einem neuen Tab geöffnet wird. Bei Videos ist es eine Mischung aus application/video und attachment, die dies verursacht.
Wir können diesen Header zumindest entfernen, denke ich.
Ich bin mir nicht sicher, ob ich das vollständig verstehe, daher eine kurze Frage zu diesem PR
Warum zielen die Änderungen speziell auf s3-bezogene Dateien ab, wenn der erzwungene Download auch dann erfolgt, wenn S3 nicht verwendet wird?
Wird das Problem dadurch generell behoben?
Wird dadurch auch der erzwungene Download für andere Dateien behoben, die im Browser geöffnet werden können, wie z. B. PDFs?
Beim Hochladen auf S3 müssen wir Header wie Content-Disposition und Content-Type der Datei angeben. Dies sind die Werte, die beim Laden der Datei zurückgegeben werden - PutObject - Amazon Simple Storage Service
Können Sie erklären, wann dies geschieht?
Der PR entfernt den Header Content-Disposition: attachment, der den Download unabhängig vom verwendeten Browser erzwingt.
Nachdem Sie Ihre Website aktualisiert haben, wird stattdessen der Content-Type verwendet, und der Browser entscheidet, was damit geschehen soll. Eine Sache ist zu beachten: Es gibt kein Problem mit Content-Type: application/mp4 auf Safari und Firefox, aber auf Chrome erzwingt es immer noch einen Download (wahrscheinlich aufgrund einer schlechten Historie, die Chrome mit dem mp4-Dateityp hat).