Beheben von fehlenden CORS-Headern für persistierte Abfragen von GraphQL in AEM as a Cloud Service
In diesem Artikel wird beschrieben, wie Sie fehlende CORS-Header in persistierten Abfrageantworten von GraphQL in Adobe Experience Manager as a Cloud Service beheben können, wenn die CDN-Caching-Funktion Probleme verursacht. Die Lösung umfasst die Aktualisierung von Cache-Steuerungs-Headern, um CDN-Caching zu verhindern und sicherzustellen, dass CORS-Header vorhanden sind.
Beschreibung description
Umgebung
- Adobe Experience Manager as a Cloud Service-Veröffentlichung oder -Vorschau
- GraphQL-Endpunkt für persistierte Abfragen:
/graphql/execute.json/* - Browserübergreifender Zugriff über das von Adobe verwaltete CDN
Problem/Symptome
- Ein Browser meldet einen CORS-Fehler, wenn eine ursprungsübergreifende Anwendung eine GraphQL-persistierte Abfrage anfordert.
- Die Anfrage enthält eine
OriginKopfzeile, aber die CDN-Antwort enthält nicht die erforderlicheAccess-Control-Allow-OriginKopfzeile. - Wiederholte Anfragen von verschiedenen Ursprüngen erhalten eine zwischengespeicherte Antwort ohne die erforderliche CORS-Kopfzeile. Die Antwort-Header zeigen eine Cache-
HITund einenAgeungleich null. - Die Dispatcher-Zwischenspeicherung für den Endpunkt der persistierten Abfrage ist deaktiviert, aber das von Adobe verwaltete CDN stellt weiterhin eine zwischengespeicherte Antwort bereit.
- Eine OSGi-CORS-Richtlinie ist in AEM konfiguriert, aber der Veröffentlichungsantwort fehlt weiterhin der CORS-Header.
Ursache
Das von Adobe verwaltete CDN speichert eine Antwort der persistierten Abfrage von GraphQL ohne Access-Control-Allow-Origin zwischen und stellt diese Antwort auf spätere Anfragen für dieselbe URL bereit. Durch Deaktivieren der Dispatcher-Zwischenspeicherung wird die Adobe-CDN-Zwischenspeicherung nicht deaktiviert. Für „Veröffentlichen“ und „Vorschau“ konfigurieren Sie CORS im Dispatcher-vhost. Die Veröffentlichungs- und Vorschau-Services verwenden für diese Konfiguration nicht die OSGi-CORS-Richtlinie.
Lösung resolution
Gehen Sie wie folgt vor, um das Problem zu beheben:
-
Überprüfen Sie die Dispatcher-Konfiguration und stellen Sie sicher, dass die Zwischenspeicherung für den Endpunkt der persistierten Abfrage von GraphQL nicht aktiviert
/graphql/execute.json/*. Die Konfigurationsvariable, die dieses Verhalten steuert, wird in der RegelCACHE_GRAPHQL_PERSISTED_QUERIES. Stellen Sie sicher, dass die Variable nicht definiert oder konfiguriert ist, um das Caching für diesen Pfad zu verhindern. -
Aktualisieren Sie die Dispatcher-vhost-Konfiguration, um
mod_headerszu verwenden, und legen Sie dieCache-Control-Kopfzeile für den Endpunkt der persistierten Abfrage von GraphQL aufprivate, no-store, no-cache, must-revalidate, max-age=0fest.code language-none Header set Cache-Control “private, no-store, no-cache, must-revalidate, max-age=0” -
Wenden Sie die Konfigurationsänderungen an und laden Sie den Dispatcher-Service neu oder starten Sie ihn neu.
-
Testen Sie den Endpunkt der persistierten Abfrage von GraphQL, indem Sie eine Anfrage senden, die eine
Origin-Kopfzeile enthält. -
Vergewissern Sie sich, dass die Antwort die erwartete
Access-Control-Allow-Origin-Kopfzeile enthält. -
Vergewissern Sie sich, dass der
x-cache-Antwort-HeaderMISSanstelle vonHITzurückgibt und so bestätigt, dass die Antwort nicht aus dem CDN-Cache bereitgestellt wird. -
Überprüfen Sie die Konfiguration der AEM-CORS-Richtlinie und stellen Sie sicher, dass
com.adobe.granite.cors.impl.CORSPolicyImplso konfiguriert ist, dass die erforderlichen Ursprünge für den Endpunkt zulässig sind. -
Wenn das CDN bereits eine Antwort zwischengespeichert hat, die die erforderliche CORS-Kopfzeile nicht enthält, löschen oder invalidieren Sie den Cache für den betroffenen Endpunkt, um sicherzustellen, dass nachfolgende Anfragen die richtigen Kopfzeilen erhalten.
-
Überprüfen Sie, ob Anfragen an den Endpunkt der persistierten Abfrage von GraphQL die erwarteten CORS-Header zurückgeben und erfolgreich verarbeitet wurden.