페이지 변형 캐싱
웹 경험은 지리, 개인화 또는 실험에 따라 서로 다른 대상에 맞게 콘텐츠를 조정해야 하는 경우가 많습니다. 이 자습서에서는 x-aem-variant 쿠키를 사용하여 여러 페이지 변형을 효율적으로 캐싱하고 제공하도록 Adobe Experience Manager(AEM) as a Cloud Service을 구성하여 규모에 맞게 유연성과 고성능을 보장하는 방법을 알아봅니다.
높은 수준에서 이 접근 방법에는 프로젝트 코드가 방문자별 x-aem-variant 쿠키(예: 위치에 따라)를 설정하는 작업이 포함되며, 이 쿠키는 CDN에서 요청 헤더로 변환됩니다. 이 값은 Dispatcher 재작성 규칙을 통해 요청 URL에 통합되어 AEM에서 올바른 변형을 렌더링하고 CDN 및 Dispatcher에서 각 변형에 대해 별도의 페이지 버전을 캐시할 수 있습니다.
예시 사용 사례
-
사용자의 지리적 위치 및 다이내믹 콘텐츠가 있는 페이지의 캐시를 기반으로 다양한 서비스 오퍼링 및 해당 가격 옵션을 제공하는 모든 서비스 공급자는 CDN 및 Dispatcher에서 관리해야 합니다.
-
소매 고객은 전국에 걸쳐 스토어를 가지고 있으며 각 스토어에는 있는 위치에 따라 다른 오퍼가 있으며 다이내믹 콘텐츠가 있는 페이지의 캐시는 CDN 및 Dispatcher에서 관리해야 합니다.
솔루션 개요
-
변형 키와 변형 키에 포함될 수 있는 값 수를 식별합니다. 이 예제에서 우리는 미국 주별로 다르므로 최대 숫자는 50이다. 이는 CDN에서 변형 제한에 문제를 일으키지 않을 만큼 충분히 작습니다. 변형 제한 검토 섹션.
-
프로젝트 코드는 "x-aem-variant" 쿠키를 방문자의 기본 설정 상태(예:
Set-Cookie: x-aem-variant=NY)을(를) 사용합니다. AEM 및 Adobe 관리 CDN은x-aem-variant을(를) 자동으로 결정하거나 설정하지 않습니다. 이 헤더/쿠키가 있는 경우 애플리케이션이 설정했기 때문입니다. 이 헤더는 사용자 지정 AEM 서블릿 또는 AEM 서블릿 필터를 통해 설정할 수 있습니다(아래 코드 샘플에 표시됨). -
방문자의 후속 요청에서는 해당 쿠키를 보냅니다(예:
"Cookie: x-aem-variant=NY") 및 쿠키는 CDN 수준에서 Dispatcher에 전달되는 사전 정의된 헤더(즉,x-aem-variant:NY)로 변환됩니다. -
Apache 재작성 규칙은 페이지 URL의 헤더 값을 Apache Sling 선택기(예:
/page.variant=NY.html). 이렇게 하면 AEM 게시는 선택기를 기반으로 다른 컨텐츠를 제공하고 Dispatcher는 변형당 하나의 페이지를 캐시할 수 있습니다. -
AEM Dispatcher에서 보낸 응답에는 HTTP 응답 헤더
Vary: x-aem-variant이(가) 있어야 합니다. 이렇게 하면 CDN이 서로 다른 헤더 값에 대해 서로 다른 캐시 사본을 저장하도록 지시합니다.
HTTP 요청 흐름
사용
-
이 기능을 보여 주기 위해 WKND의 구현을 예로 사용합니다.
-
AEM에서 SlingServletFilter을(를) 구현하여 HTTP 응답에 대한
x-aem-variant쿠키를 변형 값으로 설정합니다. -
AEM의 CDN은
x-aem-variant쿠키를 동일한 이름의 HTTP 헤더로 자동 변환합니다. -
변형 선택기를 포함하도록 요청 경로를 수정하는 Apache 웹 서버
mod_rewrite규칙을dispatcher프로젝트에 추가합니다. -
Cloud Manager을 사용하여 필터 및 다시 작성 규칙을 배포합니다.
-
전체 요청 흐름을 테스트합니다.
코드 샘플
-
AEM의 값으로
x-aem-variant쿠키를 설정하는 샘플 SlingServletFilter입니다.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() { } } -
Git에서 소스 코드로 관리되고 Cloud Manager을 사용하여 배포되는 dispatcher/src/conf.d/rewrite.rules 파일의 샘플 다시 작성 규칙입니다.
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] ...
변형 제한 사항
-
AEM의 CDN은 최대 200개의 변형을 관리할 수 있습니다. 즉,
x-aem-variant헤더의 고유 값은 최대 200개입니다. 자세한 내용은 CDN 구성 제한을 검토하십시오. -
선택한 변형 키가 이 숫자를 초과하지 않도록 주의해야 합니다. 예를 들어 사용자 ID는 대부분의 웹 사이트에 대해 200개의 값을 쉽게 초과할 수 있으므로 좋은 키가 아닌 반면, 한 국가의 주/지역은 해당 국가에 200개 미만의 주가 있는 경우 더 적합합니다.