Varianti di pagina nella cache

Scopri come impostare e utilizzare AEM as a cloud service per supportare la memorizzazione in cache delle varianti di pagina.

Esempi di casi d’uso

  • Eventuali fornitori di servizi che offrono un diverso set di offerte di servizi e le corrispondenti opzioni di prezzo in base alla geolocalizzazione dell’utente e alla cache delle pagine con contenuto dinamico devono essere gestiti in CDN e Dispatcher.

  • Un cliente al dettaglio ha negozi in tutto il paese e ogni negozio ha offerte diverse in base alla posizione in cui si trovano e la cache delle pagine con contenuto dinamico deve essere gestita in CDN e Dispatcher.

Panoramica della soluzione

  • Identifica la chiave della variante e il numero di valori che potrebbe avere. Nel nostro esempio, variiamo in base allo stato degli Stati Uniti, quindi il numero massimo è 50. Questo è abbastanza piccolo per non causare problemi con i limiti delle varianti alla CDN. Revisione della sezione sulle limitazioni delle varianti.

  • Il codice AEM deve impostare il cookie "x-aem-variant" allo 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 (ad esempio “Cookie: x-aem-variant=NY”) e il cookie viene trasformato a livello di CDN in un’intestazione predefinita (ad es. x-aem-variant:NY) che viene passato al dispatcher.

  • Una regola di riscrittura Apache modifica il percorso della richiesta per includere il valore dell'intestazione nell'URL della pagina come selettore Sling Apache (ad esempio /page.variant=NY.html). Questo consente ad AEM Publish di distribuire contenuti diversi in base al selettore e al dispatcher di memorizzare nella cache una pagina per variante.

  • La risposta inviata da AEM Dispatcher deve contenere un’intestazione di risposta HTTP Vary: x-aem-variant. Questo indica alla CDN di memorizzare diverse copie della cache per diversi valori di intestazione.

SUGGERIMENTO

Ogni volta che viene impostato un cookie (ad esempio Set-Cookie: x-aem-variant=NY) la risposta non deve essere memorizzabile nella cache (deve avere Cache-Control: private o Cache-Control: no-cache)

flusso di richieste HTTP

Flusso della richiesta di cache variante

NOTA

Il flusso iniziale di richiesta HTTP di cui sopra deve avvenire prima che venga richiesto qualsiasi contenuto che utilizzi varianti.

Utilizzo

  1. Per illustrare la funzione, utilizzeremo WKNDImplementazione di come esempio.

  2. Implementare un SlingServletFilter in AEM da impostare x-aem-variant cookie sulla risposta HTTP, con un valore variante.

  3. AEM CDN si trasforma automaticamente x-aem-variant in un'intestazione HTTP con lo stesso nome.

  4. Aggiungi una regola mod_rewrite del server Web Apache al tuo dispatcher , che modifica il percorso della richiesta per includere il selettore della variante.

  5. Distribuisci il filtro e riscrivi le regole utilizzando Cloud Manager.

  6. Verifica il flusso complessivo della richiesta.

Esempi di codice

  • Esempio di SlingServletFilter da impostare x-aem-variant cookie con un valore in AEM.

    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 dispatcher/src/conf.d/rewrite.rules file gestito come codice sorgente in Git e distribuito utilizzando Cloud Manager.

    ...
    
    RewriteCond %{REQUEST_URI} ^/us/.*
    RewriteCond %{HTTP:x-aem-variant} ^.*$
    RewriteRule ^([^?]+)\.(html.*)$ /content/wknd$1.variant=%{HTTP:x-aem-variant}.$2 [PT,L]
    
    ...
    

Limiti della variante

  • AEM CDN può gestire fino a 200 varianti. Significa che x-aem-variant L'intestazione può contenere fino a 200 valori univoci. Per ulteriori informazioni, consulta la sezione Limiti di configurazione CDN.

  • Assicurati che la chiave della variante scelta non superi mai questo numero. Ad esempio, un ID utente non è una buona chiave in quanto supererebbe facilmente 200 valori per la maggior parte dei siti web, mentre gli stati/territori in un paese sono più adatti se ci sono meno di 200 stati in quel paese.

NOTA

Quando le varianti superano 200, la rete CDN risponderà con la risposta "Troppe varianti" invece del contenuto della pagina.

In questa pagina