Network Profile
Architecture
The AEM Delivery services are set up as origins behind Content Delivery Network (CDN) infrastructure for production and are accessed by authors, stakeholders and developers directly from their browsers. In some cases the CDN infrastructure for production sites is hosted and managed by AEM customers directly (we call this BYO CDN) or it is managed by Adobe via a Cloud Service CDN (eg. BYO DNS).
The network profile below is relevant both for the interactions of end-users directly with their browsers (or other clients) but also for setup and communication from your CDN.
Delivery Services
DNS Scheme
We use a DNS scheme that identifies each origin with the following pattern. https://<ref>--<site>--<org>.aem.page
(for preview) and https://<ref>--<site>--<org>.aem.live
(for live content). <ref>
, <site>
and <org>
commonly identify GitHub repositories and references (branches or tags). Special characters in references, orgs and repositories are replaced by a single -
. The maximum length of a domain name label is 63 characters, which limits the length of the <ref>--<site>--<org>
the combination.
The DNS records for aem.page
and aem.live
are delivered with a short 10-minute time to live (TTL), so that we can switch between delivery stacks. This happens automatically.
HTTP and TLS versions
The AEM Delivery endpoints support HTTP/1.1 and HTTP/2 (H2) and TLS 1.2. HTTPS (via TLS) is enforced. All .page
and .live
subdomains additionally set HTTP Strict Transport Security (HSTS) headers, so that downgrades to HTTP are prohibited.
HTTP Headers
Many HTTP headers can be configured by the project or are dependent on the payload, but there are some headers that are handled out of the box.
Cache-Control
The client-facing cache-control
headers are set automatically by default to reflect production tested, continuously evolving, best practices based on resource types, response code and origin type. We recommend passing them on to the client "as is" through a customer's CDN.
Some resources that are immutable have very long max-age
and others that tend to change more frequently have shorter max-age
. On preview (.page)
origins max-age
is set very short, to avoid the explicit need for authors, developers and stakeholders to clear their browser cache when making changes.
We don't have any data that suggests that changing the cache-header
values on a per customer basis provides improved experiences to visitors of the sites and we do have data that shows adverse effects from changes, but we appreciate that this is a contract between the browser and a customer's CDN and understand that this is out of scope for AEM to fully control.
It is important to note that these values apply only to the cache-control
headers sent to the client, and are not related to cache management in the CDN, which is using push invalidation.
Cache-Control Header Values on .aem.page
Responses for | Header Value |
200 - Code (.js , .css , .svg , etc.) |
max-age=60, must-revalidate |
200 - Content (text/html , application/json ) |
max-age=60, must-revalidate |
200 - Media (images, videos, etc.) |
max-age=2592000, must-revalidate |
301 - Moved Permanently |
max-age=60, must-revalidate |
304 - Code |
max-age=60, must-revalidate |
304 - Content |
max-age=60, must-revalidate |
404 - Code |
max-age=60, must-revalidate |
404 - Content |
max-age=60, must-revalidate |
5xx |
max-age=60, must-revalidate |
3xx , 4xx and 5xx - Media |
max-age=3600, must-revalidate |
Cache-Control Header Values on .aem.live
Responses for | Header Value |
200 - Code (.js , .css , .svg , etc.) |
max-age=7200, must-revalidate |
200 - Content (text/html , application/json ) |
max-age=7200, must-revalidate |
200 - Media (images, videos, etc.) |
max-age=2592000, must-revalidate |
301 - Moved Permanently |
max-age=7200, must-revalidate |
304 - Code |
max-age=7200, must-revalidate |
304 - Content |
max-age=7200, must-revalidate |
404 - Code |
max-age=7200, must-revalidate |
404 - Content |
max-age=7200, must-revalidate |
5xx - Code and Content |
max-age=7200, must-revalidate |
3xx , 4xx and 5xx - Media |
max-age=3600, must-revalidate |
Vary
The vary
header is set to Accept-Encoding,X-Forwarded-Host
X-Robots-Tag
The x-robots-tag
header is automatically set to noindex, nofollow
on any .live
and .page
origin to avoid indexing. This header is removed by the CDN tier for production only.
CDN Specific Headers
To manage the cache consistency with your CDN in an optimal way and support precise push invalidation there are custom headers set for each supported CDN that control the CDNs caching behavior and cache keys. The terminology and headers as well as the available features and semantics vary greatly between vendors.
These headers are only added for requests coming from a CDN and are consumed by the CDN and are not surfaced to the browser or other clients.
URL Space
The available URL space on the .page
and .live
origins is limited to a combination of upper and lowercase basic latin letters (A-Z
and a-z
), numbers (0-9)
, dash (-
), underscore (_
), period (.
) and forward slash (/
). Certain combinations of .
and/or /
in direct succession are also not valid.
If you need to service a broader URL space we recommend rewriting URLs on your CDN tier.
Access to the available URL Space
Developers and Authors have access to the full URL space via resources coming from GitHub, Folder names or redirect sources coming from the redirects
spreadsheet.
Access to a more limited URL Space
File names in content sources (documents and spreadsheets in Sharepoint or Google Drive) are automatically rewritten to a more narrow character set including only lowercase basic latin letters (a-z
), numbers (0-9
) and dash(-
) with the corresponding extension appended.
Admin Service (API)
The admin service endpoint available on admin.hlx.page
(see API Spec here) is built to be accessed via a broad range of HTTP clients including browsers, command line tools as well as common HTTP clients.
It supports HTTP/1.1 and HTTP/2 (H2) with TLS 1.2. HTTPS (via TLS) is enforced.