Vue d’ensemble
Lors de l’utilisation de S3 ou de Cloudflare R2 pour les téléchargements, en combinaison avec une URL de CDN personnalisée, les téléchargements d’émoticônes personnalisées ne respectent pas la configuration du CDN et tentent de charger directement depuis l’URL brute du bucket.
Le problème
Lorsqu’un administrateur télécharge une émoticône personnalisée, le téléchargeur crée un enregistrement upload et enregistre l’URL brute du bucket dans la base de données (par exemple, //my-bucket.s3.amazonaws.com/... ou //my-bucket.r2.cloudflarestorage.com/...) — c’est le comportement standard de Discourse.
Cependant, lorsque app/models/emoji.rb génère le cache d’émoticônes pour /site.json, il transmet directement upload.url à l’objet emoji :
e.url = emoji.upload&.url
Comme l’assistant du CDN est contourné, le frontend reçoit l’URL brute du bucket. Ainsi, selon la rigueur des politiques d’accès du bucket, cela entraîne des images brisées ou oblige Discourse à acheminer les émoticônes via le proxy interne avatar_proxy.
Solution
J’ai ouvert une PR qui encapsule les affectations d’URL dans Discourse.store.cdn_url(), ce qui permet au chargeur d’émoticônes personnalisées de s’aligner sur la façon dont les images de messages standards et les avatars sont acheminées.
Solution temporaire
En attendant que la PR soit examinée et fusionnée, j’ai créé un composant de thème léger qui remplace l’URL brute du bucket par l’URL CDN appropriée juste avant que l’émoticône personnalisée ne soit rendue dans le DOM (fonctionne pour les messages et le chat).
Si vous rencontrez ce bug sur votre site, vous pouvez installer ce composant et configurer vos chaînes S3 dans les paramètres de l’administration du thème pour corriger les émoticônes personnalisées brisées :
Remarque : si vous avez déjà téléchargé des émoticônes personnalisées qui sont actuellement brisées, l’exécution de discourse remap "//my-raw-bucket-url.com" "https://my-cdn.com" dans le conteneur corrigera les anciennes dans la base de données, tandis que le composant de thème corrigera toutes les nouvelles émoticônes téléchargées jusqu’à ce que la correction de la PR soit fusionnée dans le noyau.
