Die neue Workbox-Service-Worker-Implementierung verwendet UrlHelper.absolute. Da es sich um ein kompiliertes Asset handelt, wird die vollständige URL gespeichert, die den vollständigen Hostnamen des Primärhosts in einer Multi-Site-Umgebung enthält.
Ich denke, es sollte stattdessen UrlHelper.local_cdn_url verwendet werden. Dies umgeht zudem die Notwendigkeit, Assets nach einer Änderung des Hostnamens neu zu kompilieren.
Ja, importScripts und modulePathPrefix in den Zeilen 3 und 6 dieser ERB-Datei.
Aber Sie verstehen mich nicht ganz. Die Probleme treten dort auf, wo in einem Multisite-Cluster kein CDN vorhanden ist.
Sowohl UrlHelper.absolute als auch UrlHelper.local_cdn_url können Situationen mit und ohne CDN handhaben.
absolute:
kein CDN: https://primarysite.ofmultisitecluster.com/javascripts/workbox/workbox-sw.jsschlecht – fremde Herkunft für alle Sites außer der Primärsite, wodurch der Hostname des Primärclusters offengelegt wird
CDN: //cdnurl/javascripts/workbox/workbox-sw.js
local_cdn_url:
kein CDN: /javascripts/workbox/workbox-sw.jsgut – relative URL
CDN: //cdnurl/javascripts/workbox/workbox-sw.js
Das Problem ist, dass diese Zeilen (3 und 6) sich nicht auf die Service-Worker-Datei beziehen.
Der Service Worker stammt von der Basisdomain (da er nicht über ein CDN ausgeliefert werden kann), aber dieser Service Worker importiert zur Laufzeit verzögert Skripte (in diesem Fall die Workbox-Bibliotheksdateien), die über ein CDN ausgeliefert werden können.
Das Problem besteht also darin, dass Ihr Multisite-Cluster kein CDN konfiguriert hat, was diesen Fehler offenlegt, der jedoch maskiert ist, wenn DISCOURSE_CDN gesetzt ist. Ich wollte nur wissen, warum uns das nicht betrifft.
Du hast recht, ich habe meinen zweiten Beitrag bearbeitet, um meine Fehler zu korrigieren.
Es geht nicht um die Service-Worker-Datei, sondern sie befindet sich IN der Service-Worker-Datei.
Nur zur Sicherheit – ist meine Diagnose korrekt und handelt es sich um einen Bug, der behoben wird? Gibt es etwas, das Sie von uns benötigen, um weiterzuhelfen?
Beim Lesen der aktuellen Implementierung von UrlHelper.absolute:
Sieht es so aus, als würde die URL durch Konkatenation von Discourse.base_url_no_prefix mit dem Parameter erstellt, wenn CDN nil ist – was in Ihrem Fall zutrifft.
Das Problem ist also, dass Discourse.base_url_no_prefix in einer Multisite-Umgebung immer die erste Hostadresse zurückgibt?
Der Name der Variablen hier, current_hostname bei Zeile 288, spricht stark dafür, dass sie multisite-fähig ist
Und laut
scheint das auch der Fall zu sein. Bisher also eine Sackgasse…
Ein anderer Blickwinkel: Diese Route hat eine besondere Behandlung erhalten, weil Browser sie extrem häufig abfragen und wir sie nicht auf ein CDN auslagern dürfen, um das Problem weiterzugeben. Dabei hatten wir vor einem Jahr einen Fehler, der mit einem Multisite-Leck zusammenhing, der von @sam behoben wurde:
Gibt es die Möglichkeit, dass die Art und Weise, wie Sie diesen Multisite-Cluster bereitstellen, diese Route auf eine undichte Weise zwischenspeichert, ähnlich wie wir es Anfang 2018 hatten?
Nein, das Problem besteht darin, dass dies beim Precompiling von Assets geschieht, was in einer Multisite-Umgebung zu Problemen führt.
Die Lösung besteht daher darin, den Hostnamen niemals in die Assets aufzunehmen (außer bei einem Asset-CDN, falls einer eingerichtet ist, da dieser ohnehin immer zwischen den Multisite-Hosts gemeinsam genutzt wird).
Aber … nur zur Sicherheit: Ich bin mir nicht sicher, wie ihr Assets auf einem CDN in Kombination mit einem Unterordner handhabt. Wenn ihr Discourse.asset_host verwendet, wird dann auch der Pfad des Unterordners allen Pfaden auf dem Asset-Host vorangestellt? Genau das macht der Code derzeit.
Wenn das tatsächlich so ist, könnt ihr diesen Absatz völlig ignorieren
Dieses ganze Subordner- und CDN-Thema hat uns tatsächlich jede Menge Probleme bereitet. @featheredtoast hat einige Arbeiten zur Straffung durchgeführt, und wir haben viel Zeit damit verbracht, sicherzustellen, dass unser Code für die Bereitstellung von Assets ordnungsgemäß mit diesen seltsamen Kombinationen aus Buckets, Subordnern usw. funktioniert.
Ich glaube, wir sind auf der sicheren Seite , aber falls nötig, können wir das Thema wieder öffnen.