Memorizzazione in cache delle varianti di pagina
Scopri come impostare e utilizzare AEM as a Cloud Service per supportare il caching delle varianti di pagina.
Casi d’uso di esempio
-
Qualsiasi provider di servizi che offra un set diverso di offerte di servizi e opzioni di prezzo corrispondenti in base alla posizione geografica dell’utente e alla cache delle pagine con contenuti dinamici deve essere gestito in CDN e Dispatcher.
-
Un cliente al dettaglio dispone di negozi in tutto il paese e ogni negozio dispone di offerte diverse in base alla posizione in cui si trova, e la cache delle pagine con contenuti dinamici deve essere gestita in CDN e Dispatcher.
Panoramica della soluzione
-
Identifica la chiave della variante e il numero di valori che può avere. Nel nostro esempio, variiamo in base allo stato USA, quindi il numero massimo è 50. È abbastanza piccolo da non causare problemi con i limiti delle varianti nella rete CDN. Rivedi la sezione limitazioni varianti.
-
Il codice AEM deve impostare il cookie "x-aem-variant" sullo stato preferito del visitatore (ad esempio
Set-Cookie: x-aem-variant=NY
) nella risposta HTTP corrispondente della richiesta HTTP iniziale. -
Le richieste successive del visitatore inviano quel cookie (esempio:
"Cookie: x-aem-variant=NY"
) e il cookie viene trasformato a livello CDN in un'intestazione predefinita (ovverox-aem-variant:NY
) che viene passata al dispatcher. -
Una regola di riscrittura Apache modifica il percorso della richiesta per includere il valore di intestazione nell’URL della pagina come selettore Sling di Apache (ad esempio,
/page.variant=NY.html
). Questo consente a AEM Publish di distribuire contenuti diversi in base al selettore e al dispatcher di memorizzare in cache una pagina per variante. -
La risposta inviata dal Dispatcher AEM deve contenere un'intestazione di risposta HTTP
Vary: x-aem-variant
. Questo indica alla rete CDN di memorizzare diverse copie della cache per diversi valori di intestazione.
Flusso di richieste HTTP
Utilizzo
-
Per illustrare la funzionalità, verrà utilizzata l'implementazione di WKND come esempio.
-
Implementa un SlingServletFilter in AEM per impostare il cookie
x-aem-variant
nella risposta HTTP, con un valore variante. -
Il CDN dell'AEM trasforma automaticamente il cookie
x-aem-variant
in un'intestazione HTTP con lo stesso nome. -
Aggiungi al progetto
dispatcher
una regola mod_rewrite del server Web Apache che modifica il percorso della richiesta in modo da includere il selettore delle varianti. -
Distribuisci il filtro e riscrivi le regole utilizzando Cloud Manager.
-
Verifica il flusso di richiesta complessivo.
Esempi di codice
-
SlingServletFilter di esempio per impostare il cookie
x-aem-variant
con un valore in AEM.code language-none package com.adobe.aem.guides.wknd.core.servlets.filters; import javax.servlet.*; import java.io.IOException; import org.apache.sling.api.SlingHttpServletRequest; import org.apache.sling.api.SlingHttpServletResponse; import org.apache.sling.servlets.annotations.SlingServletFilter; import org.apache.sling.servlets.annotations.SlingServletFilterScope; import org.osgi.service.component.annotations.Component; import org.slf4j.Logger; import org.slf4j.LoggerFactory; // Invoke filter on HTTP GET /content/wknd.*.foo|bar.html|json requests. // This code and scope is for example purposes only, and will not interfere with other requests. @Component @SlingServletFilter(scope = {SlingServletFilterScope.REQUEST}, resourceTypes = {"cq:Page"}, pattern = "/content/wknd/.*", extensions = {"html", "json"}, methods = {"GET"}) public class PageVariantFilter implements Filter { private static final Logger log = LoggerFactory.getLogger(PageVariantFilter.class); private static final String VARIANT_COOKIE_NAME = "x-aem-variant"; @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) servletResponse; SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) servletRequest; // Check is the variant was previously set final String existingVariant = slingRequest.getCookie(VARIANT_COOKIE_NAME).getValue(); if (existingVariant == null) { // Variant has not been set, so set it now String newVariant = "NY"; // Hard coding as an example, but should be a calculated value slingResponse.setHeader("Set-Cookie", VARIANT_COOKIE_NAME + "=" + newVariant + "; Path=/; HttpOnly; Secure; SameSite=Strict"); log.debug("x-aem-variant cookie is set with the value {}", newVariant); } else { log.debug("x-aem-variant previously set with value {}", existingVariant); } filterChain.doFilter(servletRequest, slingResponse); } @Override public void destroy() { } }
-
Regola di riscrittura di esempio nel file dispatcher/src/conf.d/rewrite.rules gestito come codice sorgente in Git e distribuito tramite Cloud Manager.
code language-none ... RewriteCond %{REQUEST_URI} ^/us/.* RewriteCond %{HTTP:x-aem-variant} ^.*$ RewriteRule ^([^?]+)\.(html.*)$ /content/wknd$1.variant=%{HTTP:x-aem-variant}.$2 [PT,L] ...
Limitazioni delle varianti
-
La rete CDN dell’AEM può gestire fino a 200 varianti. Ciò significa che l'intestazione
x-aem-variant
può avere fino a 200 valori univoci. Per ulteriori informazioni, controlla i limiti di configurazione CDN. -
Fai attenzione a che il codice variante scelto non superi mai questo numero. Ad esempio, un ID utente non è una buona chiave in quanto supererebbe facilmente i 200 valori per la maggior parte dei siti web, mentre gli stati/territori di un paese sono più adatti se ci sono meno di 200 stati in quel paese.