Übersicht
Wenn S3 oder Cloudflare R2 für Uploads zusammen mit einer benutzerdefinierten CDN-URL verwendet werden, beachten Uploads benutzerdefinierter Emojis die CDN-Konfiguration nicht und versuchen, direkt von der rohen Bucket-URL zu laden.
Das Problem
Wenn ein Administrator ein benutzerdefiniertes Emoji hochlädt, erstellt der Uploader einen upload-Eintrag und speichert die rohe Bucket-URL in der Datenbank (z. B. //my-bucket.s3.amazonaws.com/... oder //my-bucket.r2.cloudflarestorage.com/...) – dies ist das Standardverhalten von Discourse.
Allerdings übergibt app/models/emoji.rb beim Generieren des Emoji-Caches für /site.json die upload.url direkt an das emoji-Objekt:
e.url = emoji.upload&.url
Da der CDN-Helfer umgangen wird, erhält das Frontend die rohe Bucket-URL. Je nach Strenge der Zugriffsrichtlinien des Buckets führt dies zu defekten Bildern oder zwingt Discourse dazu, die Emojis über den internen avatar_proxy zu leiten.
Lösung
Ich habe einen PR erstellt, der die URL-Zuweisungen in Discourse.store.cdn_url() einbettet, wodurch der Lader für benutzerdefinierte Emojis mit der Weiterleitung von Standard-Bildbeiträgen und Avataren übereinstimmt.
Zwischenlösung
Während auf die Überprüfung und Zusammenführung des PR gewartet wird, habe ich ein leichtgewichtiges Theme-Component erstellt, das die rohe Bucket-URL durch die korrekte CDN-URL ersetzt, kurz bevor das benutzerdefinierte Emoji im DOM gerendert wird (funktioniert sowohl für Beiträge als auch für Chat).
Wenn du dieses Problem auf deiner Seite hast, kannst du dieses Component installieren und deine S3-Zeichenfolgen in den Theme-Admin-Einstellungen konfigurieren, um defekte benutzerdefinierte Emojis zu beheben:
Hinweis: Wenn du bereits benutzerdefinierte Emojis hochgeladen hast, die derzeit defekt sind, wird die Ausführung von discourse remap "//my-raw-bucket-url.com" "https://my-cdn.com" im Container die alten Einträge in der Datenbank beheben, während das Theme-Component alle neu hochgeladenen Emojis bis zur Zusammenführung der PR-Lösung im Core behebt.
