Paginariabelen in cache plaatsen
De ervaringen van het Web moeten vaak inhoud voor verschillend publiek-hetzij door geografie, verpersoonlijking, of experimenteren aanpassen. In deze zelfstudie leert u hoe u Adobe Experience Manager (AEM) as a Cloud Service configureert om efficiënt meerdere pagina-varianten in cache te plaatsen en te bedienen met behulp van het x-aem-variant -cookie. Hierdoor bent u verzekerd van zowel flexibiliteit als hoge prestaties op schaal.
Op een hoog niveau, impliceert de benadering de code die van uw project een bezoekersspecifieke x-aem-variant koekje (bijvoorbeeld, op plaats wordt gebaseerd) plaatst, die dan in een verzoekkopbal bij CDN wordt omgezet. Deze waarde is opgenomen in de aanvraag-URL via een verzender herschrijft-regel, waardoor AEM de juiste variant kan renderen terwijl de CDN en de verzender een aparte versie van de pagina voor elke variant in het cachegeheugen kunnen plaatsen.
Voorbeelden van gebruiksgevallen
-
Om het even welke dienstverlener die een verschillende reeks dienstenaanbod en overeenkomstige prijsstellingsopties aanbiedt die op de geo plaats van de gebruiker en het geheime voorgeheugen van pagina's met dynamische inhoud worden gebaseerd zou bij CDN en Dispatcher moeten worden beheerd.
-
Een detailhandelaar heeft winkels over het land en elke opslag heeft verschillende aanbiedingen gebaseerd op waar zij worden gevestigd en het geheime voorgeheugen van pagina's met dynamische inhoud zou bij CDN en Dispatcher moeten worden beheerd.
Overzicht van oplossing
-
Identificeer de variantsleutel en het aantal waarden het kan hebben. In ons voorbeeld variëren we per staat in de VS, dus het maximale aantal is 50. Dit is klein genoeg om geen problemen met de variantgrenzen bij CDN te veroorzaken. sectie van de de variantbeperkingen van het Overzicht {.
-
De code van het project moet het koekje "x-aem-variant" aan de aangewezen staat van de bezoeker (b.v.
Set-Cookie: x-aem-variant=NY) op de initiële HTTP-aanvraag die overeenkomt met de HTTP-respons. AEM en de door Adobe beheerde CDN bepalen of instellen niet automatischx-aem-variant. Als deze header/cookie aanwezig is, komt dat doordat de toepassing deze heeft ingesteld. Deze header kan worden ingesteld via een aangepast AEM Servlet- of AEM Servlet-filter (zoals in het onderstaande codevoorbeeld wordt getoond). -
Volgende aanvragen van de bezoeker verzenden dat cookie (bijvoorbeeld
"Cookie: x-aem-variant=NY") en de cookie wordt op CDN-niveau omgezet in een vooraf gedefinieerde header (d.w.z.x-aem-variant:NY) die wordt doorgegeven aan de dispatcher. -
Een Apache-regel voor herschrijven wijzigt het aanvraagpad zodat de koptekstwaarde in de pagina-URL wordt opgenomen als een Apache Sling-kiezer (bijvoorbeeld
/page.variant=NY.html). Op deze manier kan AEM publiceren verschillende inhoud leveren op basis van de kiezer en kan de verzender één pagina per variant in cache plaatsen. -
De reactie die AEM Dispatcher verzendt, moet een HTTP-antwoordheader
Vary: x-aem-variantbevatten. Dit instrueert CDN om verschillende geheim voorgeheugenexemplaren voor verschillende kopbalwaarden op te slaan.
HTTP-aanvraagstroom
Gebruik
-
Om de eigenschap aan te tonen, zullen wij implementatie van WKND als voorbeeld gebruiken.
-
Voer a SlingServletFilter in AEM uit om
x-aem-variantkoekje op de reactie van HTTP, met een variantwaarde te plaatsen. -
AEM CDN transformeert
x-aem-variantcookie automatisch naar een HTTP-header met dezelfde naam. -
Voeg een Apache-serverregel
mod_rewriteaan uwdispatcher-project toe, die het aanvraagpad wijzigt en de variantkiezer erin opneemt. -
Implementeer het filter en herschrijf de regels met Cloud Manager.
-
Test de algemene aanvraagstroom.
Codevoorbeelden
-
Voorbeeld van SlingServletFilter om
x-aem-variantcookie in te stellen met een waarde in 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() { } } -
De steekproef herschrijft regel in het dispatcher/src/conf.d/rewrite.rules dossier dat als broncode in Git wordt beheerd, en opgesteld gebruikend 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] ...
Variantbeperkingen
-
CDN voor AEM kan maximaal 200 variaties beheren. Dat betekent dat de header van
x-aem-variantmaximaal 200 unieke waarden kan hebben. Voor meer informatie, herzie de CDN configuratiegrenzen . -
Zorg ervoor dat de gekozen variantsleutel dit aantal nooit overschrijdt. Een gebruikers-id is bijvoorbeeld geen goede sleutel omdat deze voor de meeste websites gemakkelijk 200 waarden overschrijdt, terwijl de staten/gebieden in een land beter geschikt zijn als er minder dan 200 staten in dat land zijn.