了解如何設定和使用AEM as a cloud service以支援快取頁面變體。
任何根據使用者的地理位置以及含有動態內容之頁面的快取,提供不同服務組合和對應定價選項的服務提供者,都應在CDN和Dispatcher進行管理。
零售客戶在全國各地都有商店,而每家商店都會根據其所在位置提供不同的優惠方案,且含有動態內容的頁面快取應在CDN和Dispatcher中管理。
識別變體索引鍵及其可能具有的值數。 在我們的範例中,我們依美國各州而異,因此最大數為50。 這個小到不會造成CDN的變體限制問題。 查看變型限制部分.
AEM程式碼必須設定cookie "x-aem-variant" 訪客的偏好狀態(例如 Set-Cookie: x-aem-variant=NY
)填入初始HTTP要求的對應HTTP回應。
訪客的後續請求會傳送該Cookie(例如 "Cookie: x-aem-variant=NY"
),且Cookie會在CDN層級轉換為預先定義的標題(即 x-aem-variant:NY
),此資訊會傳遞至dispatcher。
Apache重寫規則會修改請求路徑,將頁首值加入頁面URL中,成為Apache Sling選擇器(例如 /page.variant=NY.html
). 這可讓AEM Publish根據選取器來提供不同內容,而Dispatcher可針對每個變體快取一個頁面。
AEM Dispatcher傳送的回應必須包含HTTP回應標題 Vary: x-aem-variant
. 這會指示CDN針對不同的標題值儲存不同的快取副本。
每當Cookie設定時(例如 Set-Cookie:x-aem-variant=NY)回應不應可快取(應具有快取控制:專用或快取控制:無快取)
以上的初始HTTP要求流程必須在請求使用變體的任何內容之前進行。
為了演示此功能,我們將使用 WKND的實作範例。
實作 SlingServletFilter 在AEM中設定 x-aem-variant
HTTP回應上的cookie,具有變體值。
AEM CDN自動轉換 x-aem-variant
將cookie移入相同名稱的HTTP標題中。
將Apache Web伺服器mod_rewrite規則新增至 dispatcher
專案,此專案會修改請求路徑以包含變體選取器。
使用Cloud Manager部署篩選和重寫規則。
測試整體請求流程。
要設定的範例SlingServletFilter x-aem-variant
cookie與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() { }
}
中的重寫規則範例 dispatcher/src/conf.d/rewrite.rules 檔案,在Git中以原始碼管理,並使用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最多可管理200個變體。 這表示 x-aem-variant
標題最多可以有200個不重複值。 如需詳細資訊,請檢閱 CDN設定限制.
請務必小心,以確保您選擇的變體金鑰不會超過此數字。 例如,使用者ID不是好索引鍵,因為大部分網站都很容易超過200個值,而一個國家/地區若少於200個州,則較適合該國家/地區。
當變體超過200個時,CDN會以「太多變體」回應來回應,而非以頁面內容回應。