Я только что заметил, что Discourse отправляет неверные заголовки Content-Type для нескольких типов файлов: mp4-файлы из /uploads/ передаются с content-type: application/mp4 вместо video/mp4
мои файлы загружались через S3, поэтому это зависит от хостинг-провайдера S3.
Некоторые файлы JavaScript (.js), например из /brotli_asset/, передаются с content-type: application/javascript вместо text/javascript.
Я использую discourse_docker без каких-либо изменений, проверил включённый nginx — в нём содержится правильный файл конфигурации MIME-типов. Похоже, что проблема в бэкенде Discourse, который отправляет эти неверные MIME-типы.
Привет! Насколько я понял, проблема с загрузкой была на моей стороне и вызвана провайдером S3 (я успешно решил её, переопределив настройку в моём nginx). А проблема с JS из /brotli_asset/ находится где-то во «внутреннем» nginx в Discourse, так что, похоже, это баг в discourse_docker.
Мне стыдно, но я не смог найти лучшего места для сообщения об ошибке, чем эта часть форума. Не могли бы вы подсказать, куда обратиться?
Коротко: Discourse отправляет JavaScript-файлы с разных путей и с разными MIME-типами. Например, /theme-javascripts/ff3c633d0d4192c83a194066eaa9d823b5c2d8f6.js передаётся с типом text/javascript (правильно), а упомянутый ранее /brotli_asset/… — с типом application/javascript. Это может сбить с толку прокси-серверы между Discourse и клиентом, а также аналитические системы, где я и столкнулся с этой проблемой.
Похоже, вам просто нужно правильно настроить внутренний nginx в Docker-образе Discourse для ресурсов с сжатием brotli.
В моих отчётах goaccess на панели управления mime-types для Discourse значения для js разделены: одно для text/javascript, другое для application/javascript.
Второй вариант: директивы gzip_types и brotli_types в nginx работают на основе mime-типов. Поэтому пользователям Discourse приходится настраивать как правильный text/javascript, так и некорректный application/javascript.
То же самое относится к любому прокси-серверу, который повторно сжимает контент на основе mime-типа.
Однако, при более детальном рассмотрении нашей реализации загрузчика S3 я заметил, что мы добавляем заголовок Content-Disposition со значением "attachment" практически для всех загружаемых файлов, кроме изображений. Похоже, что это должно было применяться только к SVG-файлам. Использование "attachment" приводит к тому, что контент загружается на устройство вместо открытия в новой вкладке. Для видео проблема возникает из-за комбинации application/video и attachment.
Я думаю, что мы как минимум можем убрать этот заголовок.
При загрузке в S3 необходимо указывать заголовки, такие как Content-Disposition и Content-Type файла. Именно эти значения будут возвращаться при загрузке файла — PutObject - Amazon Simple Storage Service
Не могли бы вы пояснить, в каких случаях это происходит?
В этом PR будет удалён заголовок Content-Disposition: attachment, который принудительно инициирует загрузку независимо от используемого браузера.
После обновления вашего сайта вместо этого будет использоваться заголовок Content-Type, и браузер сам решит, что с ним делать. Стоит отметить, что с Content-Type: application/mp4 проблем нет в Safari и Firefox, но в Chrome всё ещё происходит принудительная загрузка (вероятно, из-за негативной истории Chrome с типом файла mp4).