Scopri come impostare e utilizzare AEM as a cloud service per supportare la memorizzazione in cache delle varianti di pagina.
Qualsiasi fornitore di servizi che offre un diverso set di offerte di servizi e le relative opzioni di prezzo in base alla geolocalizzazione dell’utente e alla cache delle pagine con contenuto dinamico deve essere gestito 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.
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.
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)
Il flusso iniziale di richiesta HTTP di cui sopra deve avvenire prima che venga richiesto qualsiasi contenuto che utilizzi varianti.
Per illustrare la funzione, utilizzeremo WKNDImplementazione di come esempio.
Implementare un SlingServletFilter in AEM da impostare x-aem-variant
cookie sulla risposta HTTP, con un valore variante.
AEM CDN si trasforma automaticamente x-aem-variant
in un'intestazione HTTP con lo stesso nome.
Aggiungi una regola mod_rewrite del server Web Apache al tuo dispatcher
, che modifica il percorso della richiesta per includere il selettore della variante.
Distribuisci il filtro e riscrivi le regole utilizzando Cloud Manager.
Verifica il flusso complessivo della richiesta.
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]
...
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.
Quando le varianti superano 200, la rete CDN risponderà con la risposta "Troppe varianti" invece del contenuto della pagina.