Cachelagrar sidvarianter

Lär dig hur du konfigurerar och använder AEM som en molntjänst för att stödja cachelagring av sidvarianter.

Exempel på användningsområden

  • Alla tjänsteleverantörer som erbjuder en annan uppsättning tjänster och motsvarande prisalternativ baserade på användarens geografiska plats och cachen med sidor med dynamiskt innehåll bör hanteras på CDN och Dispatcher.

  • En kund hos detaljhandeln har butiker i hela landet och varje butik har olika erbjudanden beroende på var de finns och cachen med sidor med dynamiskt innehåll bör hanteras på CDN och Dispatcher.

Översikt över lösningar

  • Identifiera variantnyckeln och antalet värden som den kan ha. I vårt exempel varierar vi mellan olika delstater, så det högsta antalet är 50. Detta är tillräckligt litet för att inte orsaka problem med variantgränserna vid CDN. Granska avsnittet med variantbegränsningar.

  • AEM måste ange cookien "x-aem-variant" till besökarens önskade tillstånd (t.ex. Set-Cookie: x-aem-variant=NY) på den inledande HTTP-begärans motsvarande HTTP-svar.

  • Efterföljande förfrågningar från besökaren skickar den cookien (t.ex. "Cookie: x-aem-variant=NY") och cookien omvandlas på CDN-nivå till ett fördefinierat huvud (dvs. x-aem-variant:NY) som skickas till dispatchern.

  • En regel för omskrivning av Apache ändrar sökvägen till begäran så att den inkluderar rubrikvärdet i sidans URL som en Apache Sling-väljare (t.ex. /page.variant=NY.html). Detta gör att AEM Publish kan leverera olika innehåll baserat på väljaren och avsändaren kan cachelagra en sida per variant.

  • Svaret som skickas av AEM Dispatcher måste innehålla HTTP-svarshuvudet Vary: x-aem-variant. Detta instruerar CDN att lagra olika cachekopior för olika rubrikvärden.

TIP
När en cookie anges (t.ex. Set-Cookie: x-aem-variant=NY) svaret ska inte vara tillgängligt (ska ha Cache-Control: private eller Cache-Control: no-cache)

HTTP-begärandeflöde

Begäranflöde för variantcache

NOTE
Det inledande flödet för HTTP-begäran ovan måste ske innan innehåll som använder varianter kan begäras.

Användning

  1. För att demonstrera funktionen kommer vi att använda WKNDs implementering som exempel.

  2. Implementera en SlingServletFilter i AEM för att ange x-aem-variant cookie för HTTP-svaret, med ett variantvärde.

  3. Om du AEM CDN transformeras x-aem-variant-cookie automatiskt till en HTTP-rubrik med samma namn.

  4. Lägg till en Apache Web Server mod_rewrite-regel i ditt dispatcher-projekt, som ändrar sökvägen till begäran så att den innehåller variantväljaren.

  5. Distribuera filtret och skriv om reglerna med Cloud Manager.

  6. Testa det övergripande begärandeflödet.

Kodexempel

  • Exempel på SlingServletFilter som anger x-aem-variant-cookie med ett värde i 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() { }
    }
    
  • Exempelregel för omskrivning i filen dispatcher/src/conf.d/rewrite.rules som hanteras som källkod i Git och distribueras med 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]
    
    ...
    

Variantbegränsningar

  • AEM CDN kan hantera upp till 200 varianter. Det innebär att rubriken x-aem-variant kan ha upp till 200 unika värden. Mer information finns i CDN-konfigurationsbegränsningarna.

  • Var noga med att se till att din valda variantnyckel aldrig överstiger detta antal. Ett användar-ID är till exempel inte en bra nyckel eftersom det enkelt skulle överskrida 200 värden för de flesta webbplatser, medan delstaterna/territorierna i ett land passar bättre om det finns färre än 200 delstater i det landet.

NOTE
När varianterna överstiger 200 kommer CDN att svara med"för många varianter" i stället för sidinnehållet.
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69