Emoji personalizzati caricati da S3/R2 bypassano il routing CDN

Panoramica

Quando si utilizza S3 o Cloudflare R2 per i upload insieme a un URL CDN personalizzato, gli upload di emoji personalizzate non rispettano la configurazione del CDN e tentano di caricarsi direttamente dall’URL grezzo del bucket.

Il problema

Quando un amministratore carica un’emoji personalizzata, il sistema di upload crea un record upload e salva l’URL grezzo del bucket nel database (ad esempio //my-bucket.s3.amazonaws.com/... o //my-bucket.r2.cloudflarestorage.com/...) — questo è il comportamento standard di Discourse.

Tuttavia, quando app/models/emoji.rb genera la cache delle emoji per /site.json, passa l’upload.url direttamente all’oggetto emoji:

e.url = emoji.upload&.url

Poiché viene saltato l’helper del CDN, il frontend riceve l’URL grezzo del bucket. Di conseguenza, a seconda di quanto restrittive siano le politiche di accesso del bucket, ciò provoca immagini rotte o costringe Discourse a instradare le emoji attraverso il proxy interno avatar_proxy.

Soluzione

Ho aperto una PR che avvolge le assegnazioni degli URL in Discourse.store.cdn_url(), allineando il caricatore di emoji personalizzate al modo in cui vengono instradate le immagini standard dei post e gli avatar.

Soluzione temporanea

Mentre si attende che la PR venga revisionata e unita al codice principale, ho creato un componente tema leggero che sostituisce l’URL grezzo del bucket con il corretto URL CDN proprio prima che l’emoji personalizzata venga renderizzata nel DOM (funziona sia per i post che per la chat).

Se stai riscontrando questo bug sul tuo sito, puoi installare questo componente e configurare le tue stringhe S3 nelle impostazioni dell’amministratore del tema per correggere le emoji personalizzate rotte:

Nota: se hai già caricato emoji personalizzate che sono attualmente rotte, eseguendo discourse remap "//my-raw-bucket-url.com" "https://my-cdn.com" nel container correggerai quelle vecchie nel database, mentre il componente tema correggerà quelle caricate successivamente fino a quando la correzione della PR non verrà integrata nel codice principale.

3 Mi Piace

Test di un set di emoji predefinito

:smiley:

Test di un’emoji personalizzata

:falco:

sì, forse è solo una cosa legata a Cloudflare R2. si stanno bloccando sulla mia istanza. sembra che si blocchino solo per quelli appena caricati.

senza la correzione del componente del tema, devo eseguire il rimappaggio ogni volta che ne carico uno nuovo. la PR potrebbe aver bisogno di qualche ritocco - non sono molto bravo con il codice delle emoji.

1 Mi Piace

Discourse utilizza una configurazione con due CDN, uno per le risorse (assets) e uno che funge da proxy per l’applicazione.

Gli emoji standard utilizzano un CDN, mentre gli emoji personalizzati utilizzano l’altro CDN, ma entrambi sono protetti da un CDN in un sito web configurato correttamente con una configurazione a due CDN funzionante.

Ne ho parlato in dettaglio nel primo argomento correlato qui:

Il tuo sito ha entrambi i CDN configurati e funzionanti?

2 Mi Piace

ah, dovrò dare un’occhiata - non lo sapevo. grazie!

modifica:

ho scritto la sezione per Cloudflare R2, quindi presumo di averlo configurato correttamente? cosa potrei aver trascurato?

Confermo qui che ho installato e testato il ramo PR dopo le recenti modifiche apportate e risolve il problema.