Evitar que los anónimos descarguen archivos incompatibles con CDN

Tengo un sitio donde los archivos mp4 devuelven 404.

Tienen authorized_extensions configurado en *. La carga del archivo funciona bien. Lo veo en el sistema de archivos. Los permisos son correctos. file dice que es un archivo MP4. El registro en rails parece estar bien:

[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>

pero acceder a él devuelve un 404. Hubo un par de nuevas funciones y correcciones de errores para mp4 recientemente, pero acabo de ejecutar una actualización y todavía no funciona. No sé dónde más buscar.

El problema es que la configuración de nginx solo permite ciertos tipos de archivo. Moviendo esto a error.

En discourse.conf está esta sección:

      # esto nos permite saltarnos rails
      location ~* \.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ {
          add_header Access-Control-Allow-Origin *;
          try_files $uri =404;
      }

Añadí mp3 y mp4 a los tipos de archivo (después de webp y los mp4 ahora funcionan) a discourse.conf dentro del contenedor. Veo “saltarse rails” en discourse_docker config/nginx.sample.conf. No veo cómo entra en la plantilla dentro de docker, así que no sé cómo averiguar cuándo sucedió esto.

Tienen * para los tipos de archivo permitidos. No sé si hay alguna magia que permitiría que los mp3/mp4 funcionaran si se enumeraran en la configuración del sitio, pero no veo cómo podría ser.

Pero la descarga debería funcionar si tampoco omite Rails.

Hay una ruta para ello

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 }

y el método show simplemente debería enviar el archivo. La configuración de nginx solo lo haría más eficiente al omitir rails, pero esto no es un requisito.

Oh… las extensiones autorizadas son solo para la autorización de subida, no para descargas (es decir, que una extensión no esté en esa lista no debería impedir que un archivo se descargue).

No puedo reproducir esto en las últimas pruebas superadas, así que podrías moverlo de nuevo a Support :wink:

EDIT: Busqué el sitio en Google y parece que tienes otros problemas.

Ahora, cuando simplemente hago wget del archivo, funciona.

(EDIT 2: ¿podría ser esto porque añadiste la extensión mp4 a la configuración de nginx? Aun así, para mí simplemente funciona sin problemas)

1 me gusta

¡Gracias! Le echaré un vistazo a primera hora. ¡Supongo que debería haber probado el modo seguro!

Estoy bastante confundido por ese service worker.

No es un error.

Todavía no entiendo ese mensaje del Service Worker, pero desactivé \t\nprevent_anons_from_downloading_files y ahora funciona. ¿Parece que la configuración “prevent_anons” es incompatible con CDN?

Pero las cargas no se están recuperando de la CDN en ese sitio? Simplemente hace referencia a una ubicación en www

1 me gusta

Entonces estoy aún más confundido. Supongo que esa publicación no se volvió a hornear después de que se definió la CDN.

Pero https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/7909 se está cargando desde la CDN y cambiar la configuración lo solucionó.

También veo un montón de 404 en la consola, pero es un sitio estándar de dos contenedores con solo estos complementos:

          - 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

Y creo que estás mirando https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/8017 que se está cargando desde la CDN cuando lo miro, pero conectado y desconectado.