Scopri come impostare e utilizzare AEM as a Cloud Service per supportare il caching delle varianti di pagina.
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.
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. Sezione Limitazioni della variante di revisione.
Il codice AEM deve impostare il cookie "x-aem-variant" allo stato preferito del visitatore (ad es. 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 di CDN in un’intestazione predefinita (ovvero x-aem-variant:NY
) che viene passato 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 ad 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.
Ogni volta che viene impostato un cookie (ad es. Set-Cookie: x-aem-variant=NY) la risposta non deve essere memorizzabile in cache (deve avere Cache-Control: private o Cache-Control: no-cache)
Il flusso di richiesta HTTP iniziale deve avvenire prima che venga richiesto qualsiasi contenuto che utilizza varianti.
Per illustrare la funzione, utilizzeremo WKNDdi come esempio.
Implementare un SlingServletFilter nell'AEM per impostare x-aem-variant
cookie nella risposta HTTP, con un valore variante.
La rete CDN dell’AEM si trasforma automaticamente x-aem-variant
cookie in un’intestazione HTTP con lo stesso nome.
Aggiungi una regola mod_rewrite del server web Apache al tuo dispatcher
progetto, che modifica il percorso della richiesta per includere il selettore delle varianti.
Distribuisci il filtro e riscrivi le regole utilizzando Cloud Manager.
Verifica il flusso di richiesta complessivo.
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() { }
}
Esempio di regola di riscrittura in dispatcher/src/conf.d/rewrite.rules che viene 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]
...
La rete CDN AEM può gestire fino a 200 varianti. Ciò significa che x-aem-variant
l’intestazione può contenere fino a 200 valori univoci. Per ulteriori informazioni, consulta 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.
Quando le varianti superano le 200, la CDN risponderà con la risposta "Troppe varianti" invece del contenuto della pagina.