Предотвратить загрузку файлов, несовместимых с CDN, анонимами

У меня есть сайт, где mp4-файлы возвращают ошибку 404.

У них установлено authorized_extensions со значением *. Загрузка файлов проходит без проблем. Я вижу их в файловой системе. Права доступа установлены верно. Команда file подтверждает, что это MP4-файл. Запись в Rails выглядит корректно:

[1] pry(main)> u=Upload.find(196082)
=> #<Upload:0x00005601a1b56348
 id: 196082,
 user_id: 1,
 original_filename: "PXL_20220617_184736219.mp4",
 filesize: 9328093,
 width: nil,
 height: nil,
 url: "/uploads/default/original/3X/5/6/5679d94dfce852f780afa5fcb7f1a29d810cc8fc.mp4",
 created_at: Fri, 17 Jun 2022 18:53:41.130790000 UTC +00:00,
 updated_at: Fri, 17 Jun 2022 18:53:41.176664000 UTC +00:00,
 sha1: "5679d94dfce852f780afa5fcb7f1a29d810cc8fc",
 origin: nil,
 retain_hours: nil,
 extension: "mp4",
 thumbnail_width: nil,
 thumbnail_height: nil,
 etag: nil,
 secure: false,
 access_control_post_id: nil,
 original_sha1: nil,
 verification_status: 1,
 animated: nil,
 security_last_changed_at: nil,
 security_last_changed_reason: nil>

но при попытке открыть файл возвращается ошибка 404. Недавно было выпущено несколько новых функций и исправлений ошибок, связанных с mp4, но я только что обновил систему, и проблема всё ещё не решена. Не знаю, куда ещё можно посмотреть.

Проблема в том, что конфигурация nginx разрешает только определённые типы файлов. Переношу это в баг-трекер.

В discourse.conf есть такой блок:

      # это позволяет нам обходить rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }

Я добавил mp3 и mp4 к списку типов файлов (после webp), и теперь mp4-файлы работают. Это сделано в discourse.conf внутри контейнера. Я вижу упоминание “bypass rails” в discourse_docker config/nginx.sample.conf. Не понимаю, как этот фрагмент попадает в шаблон внутри Docker, поэтому не могу определить, когда именно это произошло.

У них стоит * в разрешённых типах файлов. Не знаю, есть ли какая-то магия, которая позволила бы mp3/mp4 работать, если бы они были перечислены в настройках сайта, но не вижу, как это могло бы быть реализовано.

Однако загрузка должна работать корректно, если она не обходит Rails.

Для этого существует маршрут:

get "uploads/:site/original/:tree:sha(.:extension)" => "uploads#show", constraints: { site: /\w+/, tree: /([a-z0-9]+\/)+/i, sha: /\h{40}/, extension: /[a-z0-9\._]+/i }

и метод show просто отправляет файл. Конфигурация nginx лишь повышает эффективность, обходя Rails, но это не является обязательным требованием.

Ох… параметр authorized_extensions предназначен только для авторизации загрузки, а не для скачивания (то есть отсутствие расширения в этом списке не должно препятствовать загрузке файла).

Мне не удалось воспроизвести эту проблему в последней версии с пройденными тестами, поэтому, возможно, вам стоит переместить тему обратно в раздел Support :wink:

РЕДАКТИРОВАНИЕ: Я поискал ваш сайт в Google, и, похоже, у вас есть и другие проблемы.

Теперь, когда я просто использую wget для скачивания файла, всё работает.

(РЕДАКТИРОВАНИЕ 2: Возможно, это связано с тем, что вы добавили расширение mp4 в конфигурацию nginx? Тем не менее, у меня всё работает из коробки).

Спасибо! Я сразу же займусь этим. Видимо, мне стоило сначала попробовать безопасный режим!

Я немного запутался в этом сервис-воркере.

Это не баг.

Я всё ещё не понимаю это сообщение Service Worker, но я отключил prevent_anons_from_downloading_files, и теперь всё работает. Похоже, что настройка «prevent_anons» несовместима с CDN?

Но загрузки не извлекаются с CDN на этом сайте? Ссылка просто указывает на расположение на www

Тогда я ещё больше запутался. Похоже, этот пост не был пересобран после определения CDN.

Однако https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/7909 загружается с CDN, и изменение настройки действительно помогло.

Я также вижу множество ошибок 404 в консоли, но это стандартный сайт с двумя контейнерами, на котором установлены только следующие плагины:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-akismet.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-canned-replies.git
          - git clone https://github.com/discourse/discourse-chat

И, думаю, вы смотрите на https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/8017, который при проверке загружается с CDN как для авторизованных, так и для неавторизованных пользователей.