Snippet di configurazione CDN per scenari comuni cdn-configuration-snippets
Questo articolo raccoglie i pattern pratici di cdn.yaml per AEM as a Cloud Service. Utilizzale insieme alla documentazione della funzione per regole traffico CDN, credenziali CDN gestite dal cliente e regole filtro traffico, incluso WAF. Distribuisci snippet con una pipeline config di Cloud Manager.
CDN gestito dal cliente customer-managed-cdn
Impostazione dell’autenticazione con chiave Edge solo per alcuni domini edge-auth-selected-hosts
Problema: in una rete CDN gestita dal cliente, è necessario applicare l’autenticazione per alcuni nomi host del cliente, mentre altri nomi host che raggiungono la pubblicazione dovrebbero rimanere disponibili senza tale intestazione (ad esempio durante il rollout o quando solo un dominio del marchio è posizionato dietro la rete CDN).
Soluzione: è necessaria l’autenticazione X-AEM-Edge-Key solo quando il primo nome host da X-Forwarded-Host è uguale al nome host di destinazione (ad esempio example.com). La regola utilizza la proprietà di richiesta forwardedDomain per eseguire la corrispondenza ed esegue l’azione authenticate sull’autenticatore Edge. Sostituisci i nomi host, i nomi degli autenticatori e i segnaposto chiave per il programma.
kind: "CDN"
version: "1"
data:
authentication:
authenticators:
- name: edge-key-auth
type: edge
edgeKey1: ${{CDN_EDGEKEY_1}}
edgeKey2: ${{CDN_EDGEKEY_2}}
rules:
- name: edge-key-auth-rule
when: { reqProperty: forwardedDomain, equals: "example.com" }
action:
type: authenticate
authenticator: edge-key-auth
Impostazione dell’autenticazione della chiave Edge per le richieste non provenienti da IP VPN edge-auth-trusted-ips
Problema: configurare l’autenticazione della chiave edge per BYOCDN ma consentire l’accesso diretto al dominio di pubblicazione solo per gli IP VPN
Soluzione: è necessaria l’autenticazione X-AEM-Edge-Key solo quando l’IP del client non è incluso nell’elenco degli IP VPN
kind: "CDN"
version: "1"
data:
authentication:
authenticators:
- name: edge-key-auth
type: edge
edgeKey1: ${{CDN_EDGEKEY_1}}
edgeKey2: ${{CDN_EDGEKEY_2}}
rules:
- name: edge-key-auth-rule
when: { reqProperty: clientIp, notIn: ["10.0.0.1", "11.0.0.0/24", "<other VPN IPs>"] }
action:
type: authenticate
authenticator: edge-key-auth
Reindirizzamenti redirects
Reindirizzamento dal dominio APEX a www apex-to-www
kind: "CDN"
version: "1"
data:
redirects:
rules:
- name: non-www-to-www-redirect
when:
reqProperty: domain
doesNotMatch: '^www\.'
action:
type: redirect
status: 301
location:
join:
format: 'https://www.%s%s'
args:
- reqProperty: domain
- reqProperty: url
Modifica della chiave della cache cache-key
La rete CDN non espone un campo “cache key” separato. Poiché l’URL partecipa alla memorizzazione in cache, è possibile dividere le voci della cache modificando l’URL, ad esempio aggiungendo un parametro di query tramite una trasformazione richiesta.
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: set-request-different-cache-curl
when:
allOf:
- reqProperty: tier
equals: publish
- reqHeader: user-agent
matches: curl
actions:
- type: set
queryParam: cache
value: 'curl'
Reindirizzamento a un percorso normalizzato trailing-slash
Invia un reindirizzamento permanente quando un browser richiede una barra finale al momento della pubblicazione, ad esempio da https://www.example.com/path/ a https://www.example.com/path.
kind: "CDN"
version: "1"
data:
redirects:
rules:
- name: remove-trailing-slash
when:
allOf:
- reqProperty: tier
equals: publish
- reqProperty: domain
equals: www.example.com
- reqProperty: originalPath
matches: ^/(.+)/$
action:
type: redirect
status: 301
location:
reqProperty: originalPath
transform:
- op: replace
match: ^/(.+)/$
replacement: https://www.example.com/\1
Estrazione di informazioni da un cookie JSON json-cookie
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: options-response
when: { reqProperty: tier, equals: publish }
actions:
- type: set
reqHeader: x-mycookie-info
value:
reqCookie: mycookie
transform:
- 'base64decode'
- { op: 'replace', match: '"info":\s*"([^"]*)"', replacement: '\1'}
Configurazione tra origini cross-origin
Distribuzione delle richieste di OPTIONS dalla rete CDN options-from-cdn
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: options-response
when:
allOf:
- { reqProperty: path, like: /mypathi* }
- { reqProperty: method, equals: "OPTIONS" }
- { reqHeader: Origin, equals: "https://example.com" }
actions:
- type: respond
status: 200
reason: "OK"
headers:
content-type: 'text/plain'
access-control-allow-origin: { reqHeader: Origin }
access-control-allow-methods: "*"
access-control-allow-headers: "*"
Filtri di traffico traffic-filters
Limitazione tariffa ASN rate-limit-asn
Problema: i limiti di velocità per IP possono non rispettare un pattern DDoS (Distributed Denial-of-Service): ogni indirizzo rimane al di sotto della soglia, pertanto il traffico legittimo e abusivo si presenta simile a quello a livello IP.
Soluzione: conteggiare le richieste in base al nome di sistema autonomo (clientAsName) in modo che il limiter aggreghi gli host che condividono lo stesso nome di rete. Lo snippet scrive clientAsName in una proprietà di registro a ogni richiesta, quindi applica un limite di velocità all’authoring e alla pubblicazione raggruppato per tale valore. Molti utenti possono condividere un ASN (ad esempio un ISP di grandi dimensioni o un’uscita VPN aziendale), quindi ottimizzare i limiti con attenzione e monitorare i registri CDN per i falsi positivi.
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: log-on-request
when: "*"
actions:
- type: set
logProperty: client_as_name
value:
reqProperty: clientAsName
trafficFilters:
rules:
- name: limit-requests-client-as-name
when:
reqProperty: tier
matches: "author|publish"
rateLimit:
limit: 60
window: 10
penalty: 300
count: all
groupBy:
- reqProperty: clientAsName
action: block