Almacenar en caché variantes de página

AEM Obtenga información sobre cómo configurar y utilizar el servicio as a Cloud para admitir variantes de página de almacenamiento en caché.

Casos de uso de ejemplo

  • Cualquier proveedor de servicios que ofrezca un conjunto diferente de ofertas de servicios y las opciones de precios correspondientes en función de la ubicación geográfica del usuario y la caché de páginas con contenido dinámico debe administrarse en CDN y Dispatcher.

  • Un cliente minorista tiene tiendas en todo el país y cada tienda tiene diferentes ofertas según su ubicación y la caché de las páginas con contenido dinámico debe administrarse en CDN y Dispatcher.

Información general de soluciones

  • Identifique la clave de variante y el número de valores que puede tener. En nuestro ejemplo, variamos por estado de EE. UU., por lo que el número máximo es 50. Esto es lo suficientemente pequeño como para no causar problemas con los límites de variante en la CDN. Revisar la sección de limitaciones de variantes.

  • AEM El código de tiempo debe establecer la cookie "x-aem-variant" en el estado preferido del visitante (p. ej. Set-Cookie: x-aem-variant=NY) en la respuesta HTTP correspondiente de la solicitud HTTP inicial.

  • Las solicitudes posteriores del visitante envían esa cookie (por ejemplo, "Cookie: x-aem-variant=NY") y la cookie se transforma en el nivel de CDN en un encabezado predefinido (es decir, x-aem-variant:NY) que se pasa al despachante.

  • Una regla de reescritura de Apache modifica la ruta de solicitud para incluir el valor del encabezado en la dirección URL de la página como un selector de Apache Sling (p. ej., /page.variant=NY.html). AEM Esto permite que Publish ofrezca contenido diferente en función del selector y que Dispatcher almacene en caché una página por variante.

  • AEM La respuesta enviada por Dispatcher debe contener un encabezado de respuesta HTTP Vary: x-aem-variant. Esto indica a la CDN que almacene diferentes copias de caché para diferentes valores de encabezado.

TIP
Siempre que se establece una cookie (p. ej. Set-Cookie: x-aem-variant=NY) la respuesta no debe ser almacenable en caché (debe tener Cache-Control: private o Cache-Control: no-cache)

Flujo de solicitud HTTP

Flujo de solicitud de caché de variante

NOTE
El flujo de solicitud HTTP inicial anterior debe tener lugar antes de que se solicite cualquier contenido que utilice variantes.

Uso

  1. Para demostrar la funcionalidad, usaremos como ejemplo la implementación de WKND.

  2. AEM Implemente un SlingServletFilter en para establecer la cookie x-aem-variant en la respuesta HTTP, con un valor de variante.

  3. AEM CDN transforma automáticamente la cookie x-aem-variant en un encabezado HTTP con el mismo nombre.

  4. Agregue una regla mod_rewrite de servidor web Apache a su proyecto dispatcher, que modifique la ruta de solicitud para incluir el selector de variantes.

  5. Implemente las reglas de filtrado y reescritura mediante Cloud Manager.

  6. Pruebe el flujo de solicitud general.

Ejemplos de código

  • AEM Ejemplo de SlingServletFilter para establecer la cookie x-aem-variant con un valor en el código de tiempo de ejecución de la.

    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() { }
    }
    
  • Regla de reescritura de muestra en el archivo dispatcher/src/conf.d/rewrite.rules, que se administra como código fuente en Git y se implementa mediante 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]
    
    ...
    

Limitaciones de variante

  • AEM CDN puede gestionar hasta 200 variaciones. Esto significa que el encabezado x-aem-variant puede tener hasta 200 valores únicos. Para obtener más información, revise los límites de configuración de CDN.

  • Debe asegurarse de que la clave de variante elegida nunca supere este número. Por ejemplo, un ID de usuario no es una buena clave, ya que fácilmente superaría los 200 valores para la mayoría de los sitios web, mientras que los estados o territorios de un país son mejores si hay menos de 200 estados en ese país.

NOTE
Cuando las variantes superen las 200, la CDN responderá con la respuesta "Demasiadas variantes" en lugar del contenido de la página.
recommendation-more-help
4859a77c-7971-4ac9-8f5c-4260823c6f69