AEM Communities의 경우 커뮤니티 사이트가 제대로 작동하도록 Dispatcher를 구성해야 합니다. 커뮤니티 활성화 및 소셜 로그인과 같은 기능을 포함할 때에는 추가 구성이 필요합니다.
특정 배포 및 사이트 디자인에 필요한 사항을 알아보려면
기본 Dispatcher 설명서도 참조하십시오.
AEM Communities에 대한 디스패처 캐싱은 디스패처가 커뮤니티 사이트 페이지의 완전히 캐시된 버전을 제공하는 기능입니다.
현재 커뮤니티 사이트를 탐색하거나 검색 결과로 커뮤니티 페이지에 도착하는 사용자와 페이지를 인덱싱하는 검색 엔진 등 익명의 사이트 방문자에 대해서만 지원됩니다. 그 이점은 익명의 사용자와 검색 엔진이 향상된 성능을 경험할 것이라는 점입니다.
로그인한 구성원의 경우 디스패처는 캐시를 건너뛰고 모든 페이지가 동적으로 생성되어 전달되도록 요청을 게시자에게 직접 전달합니다.
디스패처 캐싱을 지원하도록 구성된 경우, TTL 기반 "최대 연령" 만료가 헤더에 추가되어 디스패처 캐시된 페이지가 최신 상태인지 확인합니다.
Dispatcher 버전 4.1.2 이상(최신 버전은 Dispatcher 설치 참조)
ACS AEM Commons - Dispatcher Cache Control Header - Max Age
OSGi 구성OSGi 구성 ACS AEM Commons - Dispatcher Cache Control Header - Max Age 는 지정된 경로 아래에 표시되는 캐시된 페이지의 만료를 설정합니다.
웹 콘솔에서
ACS AEM Commons - Dispatcher Cache Control Header - Max Age
찾기
새 연결 구성을 만들려면 '+' 아이콘을 선택합니다
필터 패턴
(필수) 커뮤니티 페이지에 대한 하나 이상의 경로입니다. 예, /content/sites/engage/(.*)
.
캐시 제어 최대 연령
(필수) 캐시 제어 헤더에 추가할 최대 페이지(초)입니다. 값은 0보다 커야 합니다(0).
dispatcher.any
의 /clientheaders 섹션에서, 특정 헤더 세트를 나열하는 경우 지원 기능이 제대로 작동하려면 "CSRF-Token"
을 포함해야 합니다.
dispatcher.any
파일의 /filter 섹션이 컨텐츠에 대한 액세스 구성 - /filter에 설명되어 있습니다.
이 섹션에서는 Communities 기능의 적절한 기능을 수행하는 데 필요한 항목을 설명합니다.
필터 속성 이름은 4자리 숫자를 사용하여 필터 패턴을 적용할 순서를 나타내는 규칙을 따릅니다. 여러 필터 패턴이 요청에 적용되면 마지막으로 적용되는 필터 패턴이 유효합니다. 따라서, 가장 첫 번째 필터 패턴은 모든 것을 부인하는 데 종종 사용되어, 다음 패턴은 제어된 방식으로 액세스를 복원한다.
다음 샘플은 특정 dispatcher.any 파일에 맞게 수정해야 하는 속성 이름을 사용합니다.
참고 항목
속성 이름 예
/0050 및 /0170과 같이 표시되는 모든 속성 이름은 기존 dispatcher.any 구성 파일에 맞게 조정해야 합니다.
다음 항목을 /filter 섹션의 끝에 추가해야 합니다. 특히 모든 거부 항목 뒤에 추가합니다.
# design and template assets
/0050 { /type "allow" /glob "GET /etc/designs/*" }
# collected JS/CSS from the components and design
/0051 { /type "allow" /glob "GET /etc/clientlibs/*" }
# foundation search component - write stats
/0052 { /type "allow" /glob "GET /bin/statistics/tracker/*" }
# allow users to edit profile page
/0054 { /type "allow" /glob "* /home/users/*/*/profile.form.html*" }
# all profile data
/0057 { /type "allow" /glob "GET /home/users/*/profile/*" }
# required for social "Sign In" link.
/0059 { /type "allow" /glob "GET /etc/clientcontext/*" }
# required for "Sign Out" operation
/0063 { /type "allow" /glob "* /system/sling/logout*" }
# enable Facebook and Twitter signin
/0064 { /type "allow" /glob "GET /etc/cloudservices/*" }
# enable personalization
/0062 { /type "allow" /url "/libs/cq/personalization/*" }
# for Enablement features
/0170 { /type "allow" /url "/libs/granite/csrf/token.json*" }
/0171 { /type "allow" /glob "POST /content/sites/*/resources/en/*" }
/0172 { /type "allow" /glob "GET /content/communities/enablement/reports/*" }
/0173 { /type "allow" /glob "GET /content/sites/*" }
/0174 { /type "allow" /glob "GET /content/communities/scorm/*" }
/0175 { /type "allow" /url "GET /content/sites/*" }
/0176 { /type "allow" /url "GET /libs/granite/security/userinfo.json"}
/0177 { /type "allow" /url "GET /libs/granite/security/currentuser.json" }
# Enable CSRF token otherwise nothings works.
/5001 { /type "allow" /glob "GET /libs/granite/csrf/token.json *"}
# Allow SCF User Model to bootstrap as it depends on the granite user
/5002 { /type "allow" /glob "GET /libs/granite/security/currentuser.json*" }
# Allow Communities Site Logout button work
/5003 { /type "allow" /glob "GET /system/sling/logout.html*" }
# Allow i18n to load correctly
/5004 { /type "allow" /glob "GET /libs/cq/i18n/dict.en.json *" }
# Allow social json get pattern.
/6002 { /type "allow" /glob "GET *.social.*.json*" }
# Allow loading of templates
/6003 { /type "allow" /glob "GET /services/social/templates*" }
# Allow SCF User model to check moderator rules
/6005 { /type "allow" /glob "GET /services/social/getLoggedInUser?moderatorCheck=*" }
# Allow CKEditor to load which uses a query pattern not sufficed by regular glob above.
/6006 { /type "allow" /glob "GET /etc/clientlibs/social/thirdparty/ckeditor/*.js?t=*" }
/6007 { /type "allow" /glob "GET /etc/clientlibs/social/thirdparty/ckeditor/*.css?t=*" }
# Allow Fonts from Communities to load
/6050 { /type "allow" /glob "GET *.woff *" }
/6051 { /type "allow" /glob "GET *.ttf *" }
# Enable CQ Security checkpoint for component guide.
/7001 { /type "allow" /glob "GET /libs/cq/security/userinfo.json?cq_ck=*"
dispatcher.any
의 규칙 섹션에서는 요청된 URL을 기반으로 캐시해야 하는 응답을 정의합니다. Communities에서 규칙 섹션을 사용하여 캐시하면 안 되는 항목을 정의합니다.
# Never cache the client-side .social.json calls
/0001 { /type "deny" /glob "*.social.json*" }
# Never cache the user-specific .json requests
/0002 { /type "deny" /glob "/libs/granite/csrf/token.json*" }
/0003 { /type "deny" /glob "/libs/granite/security/currentuser.json*" }
/0004 { /type "deny" /glob "/libs/granite/security/userinfo.json*" }
# Never cache the private community groups pages in case - add your own deny rules in there
/0005 { /type "deny" /glob "/content/*/groups/*" }
# Never cache the assignments page in case the Enablement feature is in use - add your own deny rules in there
/0006 { /type "deny" /glob "/content/*/assignments/*" }
# Never cache user generated content
/0208 { /type "deny" /glob "/content/usergenerated/*" }
문제의 주요 원인은 이전 규칙에 대한 영향을 고려하지 않고 필터 규칙을 삽입하는 것입니다(특히 액세스를 거부하는 규칙을 추가할 때).
첫 번째 필터 패턴은 종종 모든 것을 거부하는 데 사용되므로 다음 필터가 제어된 방식으로 액세스를 복원합니다. 여러 필터가 요청에 적용되면 마지막으로 적용되는 필터가 적용됩니다.
다음은 Communities /filters 및 /rules를 포함하는 샘플 dispatcher.any
파일입니다.
# Each farm configures a set of load balanced renders (i.e. remote servers)
/farms
{
# First farm entry
/website
{
# Request headers that should be forwarded to the remote server.
/clientheaders
{
# Forward all request headers that are end-to-end. If you want
# to forward a specific set of headers, you'll have to list
# them here.
"*"
}
# Hostname globbing for farm selection (virtual domain addressing)
/virtualhosts
{
# Entries will be compared against the "Host" request header
# and an optional request URL prefix.
#
# Examples:
#
# www.company.com
# intranet.*
# myhost:8888/mysite
"*"
}
# The load will be balanced among these render instances
/renders
{
/rend01
{
# Hostname or IP of the render
/hostname "127.0.0.1"
# Port of the render
/port "4503"
# Connect timeout in milliseconds, 0 to wait indefinitely
# /timeout "0"
}
}
# The filter section defines the requests that should be handled by the dispatcher.
#
# Entries can be either specified using globs, or elements of the request line:
#
# (1) globs will be compared against the entire request line, e.g.:
#
# /0001 { /type "deny" /glob "* /index.html *" }
#
# matches request "GET /index.html HTTP/1.1" but not "GET /index.html?a=b HTTP/1.1".
#
# (2) method/url/query/protocol will be compared againts the respective elements of
# the request line, e.g.:
#
# /0001 { /type "deny" /method "GET" /url "/index.html" }
#
# matches both "GET /index.html" and "GET /index.html?a=b HTTP/1.1".
#
# Note: specifying elements of the request line is the preferred method.
/filter
{
# Deny everything first and then allow specific entries
/0001 { /type "deny" /glob "*" }
# Open consoles
# /0011 { /type "allow" /url "/admin/*" } # allow servlet engine admin
# /0012 { /type "allow" /url "/crx/*" } # allow content repository
# /0013 { /type "allow" /url "/system/*" } # allow OSGi console
# Allow non-public content directories
# /0021 { /type "allow" /url "/apps/*" } # allow apps access
# /0022 { /type "allow" /url "/bin/*" }
/0023 { /type "allow" /url "/content*" } # disable this rule to allow mapped content only
# /0024 { /type "allow" /url "/libs/*" }
# /0025 { /type "deny" /url "/libs/shindig/proxy*" } # if you enable /libs close access to proxy
# /0026 { /type "allow" /url "/home/*" }
# /0027 { /type "allow" /url "/tmp/*" }
# /0028 { /type "allow" /url "/var/*" }
# Enable specific mime types in non-public content directories
/0041 { /type "allow" /url "*.css" } # enable css
/0042 { /type "allow" /url "*.gif" } # enable gifs
/0043 { /type "allow" /url "*.ico" } # enable icos
/0044 { /type "allow" /url "*.js" } # enable javascript
/0045 { /type "allow" /url "*.png" } # enable png
/0046 { /type "allow" /url "*.swf" } # enable flash
/0047 { /type "allow" /url "*.jpg" } # enable jpg
/0048 { /type "allow" /url "*.jpeg" } # enable jpeg
# Deny content grabbing
/0081 { /type "deny" /url "*.infinity.json" }
/0082 { /type "deny" /url "*.tidy.json" }
/0083 { /type "deny" /url "*.sysview.xml" }
/0084 { /type "deny" /url "*.docview.json" }
/0085 { /type "deny" /url "*.docview.xml" }
/0086 { /type "deny" /url "*.*[0-9].json" }
# /0087 { /type "allow" /method "GET" /url "*.1.json" } # allow one-level json requests
# Deny query
/0090 { /type "deny" /url "*.query.json" }
#######################################
## BEGIN: AEM COMMUNITITES ADDITIONS
#######################################
/0050 { /type "allow" /glob "GET /etc/designs/*" }
/0051 { /type "allow" /glob "GET /etc/clientlibs/*" }
/0052 { /type "allow" /glob "GET /bin/statistics/tracker/*" }
/0054 { /type "allow" /glob "* /home/users/*/*/profile.form.html*" }
/0057 { /type "allow" /glob "GET /home/users/*/profile/*" }
/0059 { /type "allow" /glob "GET /etc/clientcontext/*" }
/0063 { /type "allow" /glob "* /system/sling/logout*" }
/0064 { /type "allow" /glob "GET /etc/cloudservices/*" }
/0062 { /type "allow" /url "/libs/cq/personalization/*" } # enable personalization
# For Enablement features
/0170 { /type "allow" /url "/libs/granite/csrf/token.json*" }
/0171 { /type "allow" /glob "POST /content/sites/*/resources/en/*" }
/0172 { /type "allow" /glob "GET /content/communities/enablement/reports/*" }
/0173 { /type "allow" /glob "GET /content/sites/*" }
/0174 { /type "allow" /glob "GET /content/communities/scorm/*" }
/0175 { /type "allow" /url "GET /content/sites/*" }
/0176 { /type "allow" /url "GET /libs/granite/security/userinfo.json"}
/0177 { /type "allow" /url "GET /libs/granite/security/currentuser.json" }
# Enable CSRF token otherwise nothings works.
/5001 { /type "allow" /glob "GET /libs/granite/csrf/token.json *"}
# Allow SCF User Model to bootstrap as it depends on the granite user
/5002 { /type "allow" /glob "GET /libs/granite/security/currentuser.json*" }
# Allow Communities Site Logout button work
/5003 { /type "allow" /glob "GET /system/sling/logout.html*" }
# Allow i18n to load correctly
/5004 { /type "allow" /glob "GET /libs/cq/i18n/dict.en.json *" }
# Allow social json get pattern.
/6002 { /type "allow" /glob "GET *.social.*.json*" }
# Allow loading of templates
/6003 { /type "allow" /glob "GET /services/social/templates*" }
# Allow SCF User model to check moderator rules
/6005 { /type "allow" /glob "GET /services/social/getLoggedInUser?moderatorCheck=*" }
# Allow CKEditor to load which uses a query pattern not sufficed by regular glob above.
/6006 { /type "allow" /glob "GET /etc/clientlibs/social/thirdparty/ckeditor/*.js?t=*" }
/6007 { /type "allow" /glob "GET /etc/clientlibs/social/thirdparty/ckeditor/*.css?t=*" }
# Allow Fonts from Communities to load
/6050 { /type "allow" /glob "GET *.woff *" }
/6051 { /type "allow" /glob "GET *.ttf *" }
# Enable CQ Security checkpoint for component guide.
/7001 { /type "allow" /glob "GET /libs/cq/security/userinfo.json?cq_ck=*"}
#######################################
## END: AEM COMMUNITITES ADDITIONS
#######################################
}
# The cache section regulates what responses will be cached and where.
/cache
{
# The docroot must be equal to the document root of the webserver. The
# dispatcher will store files relative to this directory and subsequent
# requests may be "declined" by the dispatcher, allowing the webserver
# to deliver them just like static files.
/docroot "/opt/dispatcher"
# Sets the level upto which files named ".stat" will be created in the
# document root of the webserver. When an activation request for some
# page is received, only files within the same subtree are affected
# by the invalidation.
#/statfileslevel "0"
# Flag indicating whether to cache responses to requests that contain
# authorization information.
/allowAuthorized "1"
# Flag indicating whether the dispatcher should serve stale content if
# no remote server is available.
#/serveStaleOnError "0"
# The rules section defines what responses should be cached based on
# the requested URL. Please note that only the following requests can
# lead to cacheable responses:
#
# - HTTP method is GET
# - URL has an extension
# - Request has no query string
# - Request has no "Authorization" header (unless allowAuthorized is 1)
/rules
{
/0000
{
# the globbing pattern to be compared against the url
# example: * -> everything
# : /foo/bar.* -> only the /foo/bar documents
# : /foo/bar/* -> all pages below /foo/bar
# : /foo/bar[./]* -> all pages below and /foo/bar itself
# : *.html -> all .html files
/glob "*"
/type "allow"
}
#######################################
## BEGIN: AEM COMMUNITITES ADDITIONS
#######################################
# Never cache the client-side .social.json calls
/0001 { /type "deny" /glob "*.social.json*" }
# Never cache the user-specific .json requests
/0002 { /type "deny" /glob "/libs/granite/csrf/token.json*" }
/0003 { /type "deny" /glob "/libs/granite/security/currentuser.json*" }
/0004 { /type "deny" /glob "/libs/granite/security/userinfo.json*" }
# Never cache the private community groups pages in case - add your own deny rules in there
/0005 { /type "deny" /glob "/content/*/groups/*" }
# Never cache the assignments page in case the enablement feature is in use - add your own deny rules in there
/0006 { /type "deny" /glob "/content/*/assignments/*" }
#######################################
## END: AEM COMMUNITITES ADDITIONS
#######################################
}
# The invalidate section defines the pages that are "invalidated" after
# any activation. Please note that the activated page itself and all
# related documents are flushed on an modification. For example: if the
# page /foo/bar is activated, all /foo/bar.* files are removed from the
# cache.
/invalidate
{
/0000
{
/glob "*"
/type "deny"
}
/0001
{
# Consider all HTML files stale after an activation.
/glob "*.html"
/type "allow"
}
/0002
{
/glob "/etc/segmentation.segment.js"
/type "allow"
}
/0003
{
/glob "*/analytics.sitecatalyst.js"
/type "allow"
}
}
# The allowedClients section restricts the client IP addresses that are
# allowed to issue activation requests.
/allowedClients
{
# Uncomment the following to restrict activation requests to originate
# from "localhost" only.
#
#/0000
# {
# /glob "*"
# /type "deny"
# }
#/0001
# {
# /glob "127.0.0.1"
# /type "allow"
# }
}
# The ignoreUrlParams section contains query string parameter names that
# should be ignored when determining whether some request's output can be
# cached or delivered from cache.
#
# In this example configuration, the "q" parameter will be ignored.
#/ignoreUrlParams
# {
# /0001 { /glob "*" /type "deny" }
# /0002 { /glob "q" /type "allow" }
# }
/enableTTL "1"
}
# The statistics sections dictates how the load should be balanced among the
# renders according to the media-type.
/statistics
{
/categories
{
/html
{
/glob "*.html"
}
/others
{
/glob "*"
}
}
}
}
}