커뮤니티에 대한 Dispatcher 구성 configuring-dispatcher-for-communities
AEM Communities aem-communities
AEM Communities의 경우 커뮤니티 사이트가 제대로 작동하도록 Dispatcher을 구성해야 합니다. 소셜 로그인과 같은 기능을 포함할 때 추가 구성이 필요합니다.
특정 배포 및 사이트 디자인에 필요한 사항을 알아보려면
- 고객 지원 센터 문의
기본 Dispatcher 설명서도 참조하세요.
Dispatcher 캐싱 dispatcher-caching
개요 overview
AEM Communities용 Dispatcher 캐싱은 Dispatcher에서 커뮤니티 사이트 페이지의 전체 캐시 버전을 제공하는 기능입니다.
현재, 커뮤니티 사이트를 탐색하거나 검색 결과로 커뮤니티 페이지에 도착하는 사용자와 같은 익명 사이트 방문자 및 페이지를 색인화하는 검색 엔진에 대해서만 지원됩니다. 익명의 사용자 및 검색 엔진이 향상된 성능을 경험한다는 이점이 있습니다.
로그인한 멤버의 경우 Dispatcher이 캐시를 무시하고 요청을 게시자에게 직접 전달하므로 모든 페이지가 동적으로 생성되고 전달됩니다.
Dispatcher 캐싱을 지원하도록 구성된 경우, TTL 기반 "최대 기간" 만료가 헤더에 추가되어 Dispatcher 캐싱된 페이지가 최신 상태인지 확인합니다.
요구 사항 requirements
-
Dispatcher 버전 4.1.2 이상(최신 버전은 Dispatcher 설치 참조)
-
- 버전 3.3.2 이상
ACS AEM Commons - Dispatcher Cache Control Header - Max Age
OSGi 구성
구성 configuration
OSGi 구성 ACS AEM Commons - Dispatcher 캐시 제어 헤더 - Max Age 는 지정된 경로에 나타나는 캐시된 페이지의 만료를 설정합니다.
-
웹 콘솔에서.
-
ACS AEM Commons - Dispatcher Cache Control Header - Max Age
찾기 -
연결 구성을 만들 수 있도록 '+' 아이콘을 선택합니다.
-
필터 패턴
(필수) 커뮤니티 페이지에 대한 하나 이상의 경로. 예:/content/sites/engage/(.*)
-
Cache-Control 최대 수명
(필수) 캐시 제어 헤더에 추가할 최대 기간(초)입니다. 값은 0보다 커야 합니다.
Dispatcher 필터 dispatcher-filters
dispatcher.any
파일의 /filter 섹션은 콘텐츠에 대한 액세스 구성 - /filter에 설명되어 있습니다.
이 섹션에서는 Communities 기능이 제대로 작동하는 데 필요한 항목에 대해 설명합니다.
필터 속성 이름은 필터 패턴을 적용할 순서를 나타내기 위해 4자리 숫자를 사용하는 규칙을 따릅니다. 여러 필터 패턴이 요청에 적용되는 경우 마지막으로 적용된 필터 패턴이 유효합니다. 따라서 첫 번째 필터 패턴은 종종 모든 것을 거부하는 데 사용되므로 다음 패턴은 제어된 방식으로 액세스를 복원하는 역할을 합니다.
다음 샘플에서는 특정 dispatcher.any
파일에 맞도록 수정해야 하는 속성 이름을 사용합니다.
추가 참조:
/0050 및 /0170 과(와) 같이 표시된 모든 속성 이름은 기존
dispatcher.any
구성 파일에 맞게 조정해야 합니다./filter 섹션의 끝에 다음 항목을 추가해야 합니다. 특히 거부된 모든 항목 다음에 추가됩니다.
# design and template assets
/0050 { /type "allow" /url "/etc/designs/*" }
# collected JS/CSS from the components and design
/0051 { /type "allow" /url "/etc/clientlibs/*" }
# foundation search component - write stats
/0052 { /type "allow" /url "/bin/statistics/tracker/*" }
# allow users to edit profile page
/0054 { /type "allow" /url "* /home/users/*/*/profile.form.html*" }
# all profile data
/0057 { /type "allow" /url "/home/users/*/profile/*" }
# required for social "Sign In" link.
/0059 { /type "allow" /url "/etc/clientcontext/*" }
# required for "Sign Out" operation
/0063 { /type "allow" /url "* /system/sling/logout*" }
# enable Facebook and Twitter signin
/0064 { /type "allow" /url "/etc/cloudservices/*" }
# enable personalization
/0062 { /type "allow" /url "/libs/cq/personalization/*" }
# Enable CSRF token otherwise nothings works.
/5001 { /type "allow" /url "/libs/granite/csrf/token.json *"}
# Allow SCF User Model to bootstrap as it depends on the granite user
/5002 { /type "allow" /url "/libs/granite/security/currentuser.json*" }
# Allow Communities Site Logout button work
/5003 { /type "allow" /url "/system/sling/logout.html*" }
# Allow i18n to load correctly
/5004 { /type "allow" /url "/libs/cq/i18n/dict.en.json *" }
# Allow social json get pattern.
/6002 { /type "allow" /url "*.social.*.json*" }
# Allow loading of templates
/6003 { /type "allow" /url "/services/social/templates*" }
# Allow SCF User model to check moderator rules
/6005 { /type "allow" /url "/services/social/getLoggedInUser?moderatorCheck=*" }
# Allow CKEditor to load which uses a query pattern.
/6006 { /type "allow" /url "/etc/clientlibs/social/thirdparty/ckeditor/*.js?t=*" }
/6007 { /type "allow" /url "/etc/clientlibs/social/thirdparty/ckeditor/*.css?t=*" }
# Allow Fonts from Communities to load
/6050 { /type "allow" /url "*.woff" }
/6051 { /type "allow" /url "*.ttf" }
# Enable CQ Security checkpoint for component guide.
/7001 { /type "allow" /url "/libs/cq/security/userinfo.json?cq_ck=*"
Dispatcher 규칙 dispatcher-rules
dispatcher.any
의 규칙 섹션은 요청된 URL을 기반으로 캐시할 응답을 정의합니다. Communities에서는 규칙 섹션을 사용하여 캐시해서는 안 되는 항목을 정의합니다.
# Never cache the client-side .social.json calls
/0001 { /type "deny" /url "*.social.json*" }
# Never cache the user-specific .json requests
/0002 { /type "deny" /url "/libs/granite/csrf/token.json*" }
/0003 { /type "deny" /url "/libs/granite/security/currentuser.json*" }
/0004 { /type "deny" /url "/libs/granite/security/userinfo.json*" }
# Never cache the private community groups pages in case - add your own deny rules in there
/0005 { /type "deny" /url "/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" /url "/content/*/assignments/*" }
# Never cache user generated content
/0208 { /type "deny" /url "/content/usergenerated/*" }
문제 해결 troubleshooting
특히 액세스를 거부하는 규칙을 추가할 때 이전 규칙에 미치는 영향에 유의하지 않고 필터 규칙을 삽입하는 것이 문제의 주요 원인입니다.
첫 번째 필터 패턴은 종종 다음 필터가 제어된 방식으로 액세스를 복원하도록 모든 것을 거부하는 데 사용됩니다. 여러 필터가 요청에 적용되는 경우 마지막으로 적용된 필터가 적용됩니다.
샘플 dispatcher.any sample-dispatcher-any
다음은 Communities /filters 및 /rules가 포함된 샘플 dispatcher.any
파일입니다.
# Each farm configures a set of load balanced renders (that is, 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 matching 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 urls, or elements of the request line:
#
# (1) urls will be compared against the entire request line, for example,:
#
# /0001 { /type "deny" /url "* /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, for example,:
#
# /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" /url "*" }
# 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" /url "/etc/designs/*" }
/0051 { /type "allow" /url "/etc/clientlibs/*" }
/0052 { /type "allow" /url "/bin/statistics/tracker/*" }
/0054 { /type "allow" /url "* /home/users/*/*/profile.form.html*" }
/0057 { /type "allow" /url "/home/users/*/profile/*" }
/0059 { /type "allow" /url "/etc/clientcontext/*" }
/0063 { /type "allow" /url "* /system/sling/logout*" }
/0064 { /type "allow" /url "/etc/cloudservices/*" }
/0062 { /type "allow" /url "/libs/cq/personalization/*" } # enable personalization
# Enable CSRF token otherwise nothings works.
/5001 { /type "allow" /url "/libs/granite/csrf/token.json *"}
# Allow SCF User Model to bootstrap as it depends on the granite user
/5002 { /type "allow" /url "/libs/granite/security/currentuser.json*" }
# Allow Communities Site Logout button work
/5003 { /type "allow" /url "/system/sling/logout.html*" }
# Allow i18n to load correctly
/5004 { /type "allow" /url "/libs/cq/i18n/dict.en.json *" }
# Allow social json get pattern.
/6002 { /type "allow" /url "*.social.*.json*" }
# Allow loading of templates
/6003 { /type "allow" /url "/services/social/templates*" }
# Allow SCF User model to check moderator rules
/6005 { /type "allow" /url "/services/social/getLoggedInUser?moderatorCheck=*" }
# Allow CKEditor to load which uses a query pattern.
/6006 { /type "allow" /url "/etc/clientlibs/social/thirdparty/ckeditor/*.js?t=*" }
/6007 { /type "allow" /url "/etc/clientlibs/social/thirdparty/ckeditor/*.css?t=*" }
# Allow Fonts from Communities to load
/6050 { /type "allow" /url "*.woff" }
/6051 { /type "allow" /url "*.ttf" }
# Enable CQ Security checkpoint for component guide.
/7001 { /type "allow" /url "/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. 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 matching 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
/url "*"
/type "allow"
}
#######################################
## BEGIN: AEM COMMUNITITES ADDITIONS
#######################################
# Never cache the client-side .social.json calls
/0001 { /type "deny" /url "*.social.json*" }
# Never cache the user-specific .json requests
/0002 { /type "deny" /url "/libs/granite/csrf/token.json*" }
/0003 { /type "deny" /url "/libs/granite/security/currentuser.json*" }
/0004 { /type "deny" /url "/libs/granite/security/userinfo.json*" }
# Never cache the private community groups pages in case - add your own deny rules in there
/0005 { /type "deny" /url "/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" /url "/content/*/assignments/*" }
#######################################
## END: AEM COMMUNITITES ADDITIONS
#######################################
}
# The invalidate section defines the pages that are "invalidated" after
# any activation. 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
{
/url "*"
/type "deny"
}
/0001
{
# Consider all HTML files stale after an activation.
/url "*.html"
/type "allow"
}
/0002
{
/url "/etc/segmentation.segment.js"
/type "allow"
}
/0003
{
/url "*/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
# {
# /url "*"
# /type "deny"
# }
#/0001
# {
# /url "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 { /url "*" /type "deny" }
# /0002 { /url "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
{
/url "*.html"
}
/others
{
/url "*"
}
}
}
}
}