Configurazione del traffico sulla rete CDN cdn-configuring-cloud
AEM as a Cloud Service offre una raccolta di funzionalità configurabili a livello di CDN gestita da Adobe che modificano la natura delle richieste in arrivo o delle risposte in uscita. Le seguenti regole, descritte in dettaglio in questa pagina, possono essere dichiarate per ottenere il seguente comportamento:
- Trasformazioni richieste - Modifica gli aspetti delle richieste in arrivo, inclusi intestazioni, percorsi e parametri.
- Trasformazioni di risposta - Modifica le intestazioni che stanno per essere inviate al client (ad esempio, un browser Web).
- Reindirizzamenti lato server - attiva un reindirizzamento del browser.
- Selettori di origine - proxy a un backend di origine diverso.
Nella rete CDN sono configurabili anche le regole del filtro del traffico (incluso WAF), che controllano il traffico consentito o negato dalla rete CDN. Questa funzionalità è già stata rilasciata ed è possibile ottenere ulteriori informazioni nella pagina Regole filtro del traffico, incluse le regole di WAF.
Inoltre, se la rete CDN non è in grado di contattare la relativa origine, puoi scrivere una regola che fa riferimento a una pagina di errore personalizzata con hosting autonomo (di cui viene quindi eseguito il rendering). Ulteriori informazioni leggendo l’articolo Configurazione delle pagine di errore CDN.
Tutte queste regole, dichiarate in un file di configurazione nel controllo del codice sorgente, vengono distribuite tramite la pipeline config di Cloud Manager. Tieni presente che la dimensione cumulativa del file di configurazione, incluse le regole del filtro del traffico, non può superare i 100 KB.
Per ulteriori snippet di codice per scenari comuni, consulta l’articolo Snippet di configurazione CDN per scenari comuni.
Ordine di valutazione order-of-evaluation
Dal punto di vista funzionale, le varie feature menzionate in precedenza vengono valutate nella seguente sequenza:
Configurazione initial-setup
Prima di configurare il traffico sulla rete CDN, è necessario effettuare le seguenti operazioni:
-
Creare un file denominato
cdn.yamlo simile, facendo riferimento ai vari snippet di configurazione nelle sezioni seguenti.Tutti i frammenti hanno queste proprietà comuni, descritte in Pipeline di configurazione. Il valore della proprietà
kinddeve essere CDN e la proprietàversiondeve essere impostata su 1.code language-none kind: "CDN" version: "1" -
Posizionare il file in una cartella di primo livello denominata config o simile, come descritto in Pipeline di configurazione.
-
Creare una pipeline di configurazione in Cloud Manager, come descritto in Pipeline di configurazione.
-
Distribuisci la configurazione.
Sintassi delle regole configuration-syntax
I tipi di regole nelle sezioni seguenti condividono una sintassi comune.
La sintassi tipica delle regole è una voce di elenco con un nome, una condizione when e una o più azioni:
- name: <name>
when: <condition>
action: <action>
Ogni sezione di primo livello (requestTransformations, responseTransformations, redirects, originSelectors e trafficFilters in Regole filtro traffico) supporta il proprio set di tipi di azioni e proprietà; i valori e i campi type consentiti sono definiti nelle tabelle e negli esempi di tale sezione, non condivisi tra tutti i tipi di regole. Sezioni come requestTransformations e responseTransformations supportano più azioni specificate come elenco yaml nella proprietà actions.
La clausola “when” determina se una regola verrà valutata in base a proprietà quali dominio, percorso, stringhe di query, intestazioni e cookie. La sintassi è la stessa per tutti i tipi di regole. Vedere Struttura delle condizioni di seguito. Le regole del filtro del traffico (incluso WAF) utilizzano la stessa sintassi di condizione. Per informazioni sulle azioni, sui limiti di tariffa e sul comportamento specifico di WAF, vedere Regole del filtro del traffico, incluse le regole di WAF.
Struttura della condizione condition-structure
Una condizione può essere una condizione semplice o un gruppo di condizioni.
Condizione semplice
Una condizione semplice è composta da un getter e da un predicato.
{ <getter>: <value>, <predicate>: <value> }
Gruppo di condizioni
Un gruppo di condizioni è composto da più condizioni semplici e/o da condizioni di gruppo.
<allOf|anyOf>:
- { <getter>: <value>, <predicate>: <value> }
- { <getter>: <value>, <predicate>: <value> }
- <allOf|anyOf>:
- { <getter>: <value>, <predicate>: <value> }
array[Condition]array[Condition]Getter
stringProprietà richiesta.
Una di:
path: restituisce il percorso completo di un URL senza i parametri di query. (utilizzapathRawper la variante senza escape)originalPath: restituisce il percorso originale immutabile della richiesta senza i parametri di query, ovvero il percorso prima di qualsiasi trasformazione di richiesta CDN.url: restituisce l’URL completo, inclusi i parametri di query. (utilizzaurlRawper la variante senza escape)originalUrl: restituisce l’URL completo immutabile originale della richiesta, inclusi i parametri di query, ovvero l’URL prima di qualsiasi trasformazione di richiesta CDN.queryString: restituisce la parte di query di un URLmethod: restituisce il metodo HTTP utilizzato nella richiesta.tier: restituisce uno traauthor,previewopublish.domain: restituisce la proprietà del dominio (come definito nell’intestazioneHost) in minuscoloclientIp: restituisce l’IP del client.forwardedDomain: restituisce il primo dominio definito nell’intestazioneX-Forwarded-Hostin minuscoloforwardedIp: restituisce il primo IP nell’intestazioneX-Forwarded-For.clientRegion: restituisce il codice di suddivisione del Paese che identifica l’area geografica in cui si trova il client, come descritto in ISO 3166-2.clientCountry: restituisce un codice di due lettere (simbolo indicatore regionale) che identifica il paese in cui si trova il client.clientContinent: restituisce un codice a due lettere (AF, AN, AS, EU, NA, OC, SA) che identifica il continente in cui si trova il client.clientAsNumber: restituisce il numero di Sistema autonomo associato all’IP del client.clientAsName: restituisce il nome associato al numero di Sistema autonomo.
stringstringstringstringapplication/x-www-form-urlencodedPredicato
stringstringstringstringstringstringarray[string]array[string]booleanNote
- La proprietà di richiesta
clientIppuò essere utilizzata solo con i seguenti predicati:equals,doesNotEqual,in,notIn.clientIppuò essere confrontata anche con intervalli IP quando si utilizzano i predicatiinenotIn. L’esempio seguente implementa una condizione per valutare se l’IP di un client rientra nell’intervallo IP 192.168.0.0/24 (quindi da 192.168.0.0 a 192.168.0.255):
when:
reqProperty: clientIp
in: [ "192.168.0.0/24" ]
- Adobe consiglia di utilizzare regex101 e Fastly Fiddle, quando si lavora con regex. Per ulteriori informazioni su come Fastly gestisce regex, consulta la documentazione di fastly: espressioni regolari in Fastly VCL.
I dettagli del nodo delle azioni differiscono per tipo di regola e sono descritti nelle singole sezioni seguenti.
Nelle regole di configurazione è possibile fare riferimento a segreti definiti come variabili di ambiente (vedere Segreti di configurazione).
Richiedi trasformazioni request-transformations
Le regole di trasformazione delle richieste consentono di modificare le richieste in ingresso. Le regole supportano l’impostazione, la disimpostazione e l’alterazione di percorsi, parametri di query e intestazioni (inclusi i cookie) in base a varie condizioni di corrispondenza, comprese le espressioni regolari. Puoi anche impostare le variabili, a cui è possibile fare riferimento in un secondo momento nella sequenza di valutazione.
I casi d’uso sono vari e includono la riscrittura degli URL per semplificare l’applicazione o mappare gli URL legacy.
Come indicato in precedenza, esiste un limite di dimensione per il file di configurazione, pertanto le organizzazioni con requisiti più grandi devono definire regole nel livello apache/dispatcher.
Esempio di configurazione:
kind: "CDN"
version: "1"
data:
requestTransformations:
removeMarketingParams: true
rules:
- name: set-header-rule
when:
reqProperty: path
like: /set-header
actions:
- type: set
reqHeader: x-some-header
value: some value
- name: set-header-with-reqproperty-rule
when:
reqProperty: path
like: /set-header
actions:
- type: set
reqHeader: x-some-header
value: {reqProperty: path}
- name: unset-header-rule
when:
reqProperty: path
like: /unset-header
actions:
- type: unset
reqHeader: x-some-header
- name: unset-matching-query-params-rule
when:
reqProperty: path
equals: /unset-matching-query-params
actions:
- type: unset
queryParamMatch: ^removeMe_.*$
- name: unset-all-query-params-except-exact-two-rule
when:
reqProperty: path
equals: /unset-all-query-params-except-exact-two
actions:
- type: unset
queryParamMatch: ^(?!leaveMe$|leaveMeToo$).*$
- name: multi-action
when:
reqProperty: path
like: /multi-action
actions:
- type: set
reqHeader: x-header1
value: body set by transformation rule
- type: set
reqHeader: x-header2
value: '201'
- name: replace-html
when:
reqProperty: path
like: /mypath
actions:
- type: transform
reqProperty: path
op: replace
match: \.html$
replacement: ""
- name: log-on-request
when: "*"
actions:
- type: set
logProperty: forwarded_host
value:
reqHeader: x-forwarded-host
Azioni
Nella tabella seguente sono illustrate le azioni disponibili.
Le azioni di sostituzione supportano i gruppi di acquisizione, come illustrato di seguito:
- name: extract-country-code-from-path
when:
reqProperty: path
matches: ^/([a-zA-Z]{2})(/.*|$)
actions:
- type: set
var: country-code
value:
reqProperty: path
- type: transform
var: country-code
op: replace
match: ^/([a-zA-Z]{2})(/.*|$)
replacement: \1
- name: replace-jpg-with-jpeg
when:
reqProperty: path
like: /mypath
actions:
- type: transform
reqProperty: path
op: replace
match: (.*)(\.jpg)$
replacement: "\1\.jpeg"
Le azioni possono essere concatenate tra loro. Ad esempio:
actions:
- type: transform
reqProperty: path
op: replace
match: \.html$
replacement: ""
- type: transform
reqProperty: path
op: tolower
Variabili variables
Puoi impostare le variabili durante la trasformazione della richiesta e quindi farvi riferimento in un secondo momento nella sequenza di valutazione. Per ulteriori dettagli, consulta il diagramma dell’ordine di valutazione.
Esempio di configurazione:
kind: "CDN"
version: "1"
data:
requestTransformations:
rules:
- name: set-variable-rule
when:
reqProperty: path
equals: /set-variable
actions:
- type: set
var: some_var_name
value: some_value
responseTransformations:
rules:
- name: set-response-header-while-variable
when:
var: some_var_name
equals: some_value
actions:
- type: set
respHeader: x-some-header
value: some header value
Proprietà registro logproperty
Puoi aggiungere proprietà di registro personalizzate nei registri CDN utilizzando le trasformazioni di richiesta e risposta.
Esempio di configurazione:
requestTransformations:
rules:
- name: log-on-request
when: "*"
actions:
- type: set
logProperty: forwarded_host
value:
reqHeader: x-forwarded-host
responseTransformations:
rules:
- name: log-on-response
when: '*'
actions:
- type: set
logProperty: cache_control
value:
respHeader: cache-control
Esempio di registro:
{
"timestamp": "2025-03-26T09:20:01+0000",
"ttfb": 19,
"cli_ip": "147.160.230.112",
"cli_country": "CH",
"rid": "974e67f6",
"req_ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15",
"host": "example.com",
"url": "/content/hello.png",
"method": "GET",
"res_ctype": "image/png",
"cache": "PASS",
"status": 200,
"res_age": 0,
"pop": "PAR",
"rules": "",
"forwarded_host": "example.com",
"cache_control": "max-age=300"
}
Trasformazioni di risposta response-transformations
Le regole di trasformazione della risposta consentono di impostare e annullare l’impostazione di intestazioni, cookie e stato delle risposte in uscita della rete CDN. Inoltre, consulta l’esempio precedente per un riferimento a una variabile precedentemente impostata in una regola di trasformazione della richiesta.
Esempio di configurazione:
kind: "CDN"
version: "1"
data:
responseTransformations:
rules:
- name: set-response-header-rule
when:
reqProperty: path
like: /set-response-header
actions:
- type: set
value: value-set-by-resp-rule
respHeader: x-resp-header
- name: unset-response-header-rule
when:
reqProperty: path
like: /unset-response-header
actions:
- type: unset
respHeader: x-header1
- name: multi-action-response-header-rule
when:
reqProperty: path
like: /multi-action-response-header
actions:
- type: set
respHeader: x-resp-header-1
value: value-set-by-resp-rule-1
- type: set
respHeader: x-resp-header-2
value: value-set-by-resp-rule-2
- name: status-code-rule
when:
reqProperty: path
like: status-code
actions:
- type: set
respProperty: status
value: '410'
- name: set-response-cookie-with-attributes-as-object
when: '*'
actions:
- type: set
respCookie: first-name
value: first-value
attributes:
expires: '2025-08-29T10:00:00'
domain: example.com
path: /some-path
secure: true
httpOnly: true
extension: ANYTHING
- name: unset-response-cookie
when: '*'
actions:
- type: unset
respCookie: third-name
Azioni
Nella tabella seguente sono illustrate le azioni disponibili.
Selettori di origine origin-selectors
Puoi sfruttare la rete CDN di AEM per indirizzare il traffico a diversi backend, incluse le applicazioni non Adobe (ad esempio in base al percorso o al sottodominio).
Le proprietà di richiesta originalPath e originalUrl sono rispettivamente il percorso originale immutabile (senza parametri di query) e l’URL completo (inclusi i parametri di query), ciascuno prima di qualsiasi trasformazione di richiesta CDN. Utilizzarle in condizioni when quando è necessario ancorare le regole su ciò che il client ha inviato inizialmente, anziché sui valori che potrebbero essere stati riscritti in precedenza nella sequenza di valutazione. Utilizza originalPath per la corrispondenza solo percorso; utilizza originalUrl quando la stringa di query deve far parte della condizione (ad esempio, routing o filtro su un URL di richiesta iniziale specifico).
Esempio di configurazione:
kind: "CDN"
version: "1"
data:
originSelectors:
rules:
- name: example-com
when: { reqProperty: originalPath, like: /proxy* }
action:
type: selectOrigin
originName: example-com
# skipCache: true
# headers:
# Authorization: ${{AUTH_TOKEN}}
origins:
- name: example-com
domain: www.example.com
# ip: '1.1.1.1'
# forwardHost: true
# forwardCookie: true
# forwardAuthorization: true
# timeout: 20
Azioni
Nella tabella seguente è illustrata l’azione disponibile.
{})static).{})Origini
Le connessioni alle origini sono solo SSL e utilizzano la porta 443.
.adobeaemcloud.com. Non è possibile eseguire il proxy diretto a un dominio adobeaemcloud.com. Questa restrizione protegge da loop di richiesta indesiderati. Per inoltrare il traffico all'ambiente AEM as a Cloud Service, utilizza come backend di origine un dominio personalizzato installato nell'ambiente AEMaaCS.Trasferimento del dominio personalizzato al livello statico di AEM proxy-custom-domain-static
I selettori di origine possono essere utilizzati per instradare il traffico di pubblicazione AEM al contenuto statico AEM distribuito utilizzando la pipeline front-end. I casi d’uso includono l’utilizzo di risorse statiche sullo stesso dominio della pagina (ad esempio, example.com/static) o su un dominio esplicitamente diverso (ad esempio, static.example.com).
Di seguito è riportato un esempio di regola del selettore di origine che può eseguire questa operazione:
kind: CDN
version: '1'
data:
originSelectors:
rules:
- name: select-aem-static-origin
when:
reqProperty: domain
equals: static.example.com
action:
type: selectAemOrigin
originName: static
Proxy a Edge Delivery Services proxying-to-edge-delivery
Esistono scenari in cui i selettori di origine devono essere utilizzati per instradare il traffico attraverso AEM Publish ad AEM Edge Delivery Services:
- Alcuni contenuti vengono distribuiti da un dominio gestito da AEM Publish, mentre altri contenuti dello stesso dominio vengono distribuiti da Edge Delivery Services.
- Il contenuto distribuito da Edge Delivery Services trarrebbe vantaggio dalle regole distribuite tramite la pipeline di configurazione, incluse le regole del filtro del traffico o le trasformazioni di richiesta/risposta.
- La pipeline di configurazione di Edge Delivery consente di configurare le impostazioni CDN gestite da Adobe definendo regole quali
trafficFilters,originSelectorseredirects.
Di seguito è riportato un esempio di regola del selettore di origine che può eseguire questa operazione:
kind: CDN
version: '1'
data:
originSelectors:
rules:
- name: select-edge-delivery-services-origin
when:
allOf:
- reqProperty: tier
equals: publish
- reqProperty: domain
equals: <Production Host>
- reqProperty: path
matches: "^(/scripts/.*|/styles/.*|/fonts/.*|/blocks/.*|/icons/.*|.*/media_.*|/favicon.ico)"
action:
type: selectOrigin
originName: aem-live
origins:
- name: aem-live
domain: main--repo--owner.aem.live
Esecuzione del proxy nell’ambiente AEMaaCS proxying-to-aemaacs
Impossibile utilizzare un dominio adobeaemcloud.com direttamente come origine nella configurazione CDN. Questa operazione è rifiutata (il dominio non deve contenere .adobeaemcloud.com) per proteggere da loop di richieste indesiderati. Ciò si applica anche quando si esegue il routing da un dominio installato per un sito Edge Delivery.
Se il dominio personalizzato (www.example.com) è già installato in un ambiente AEMaaCS, il routing predefinito verrà indirizzato al backend di AEM senza alcuna regola CDN. Utilizza i selettori di origine quando devi indirizzare tra ambienti diversi (ad esempio, da pXXXX-eYYYY a pXXXX-eZZZZ) o da un sito Edge Delivery a un ambiente AEMaaCS.
In questi casi, per inoltrare il traffico all’ambiente AEM as a Cloud Service (ad esempio, per instradare percorsi specifici come /graphql a un back-end), installa un dominio personalizzato nell’ambiente AEMaaCS e utilizzalo come origine nella configurazione CDN.
Esempio: Se il livello di pubblicazione di AEM è raggiungibile alle publish-pXXXXX-eYYYYY.adobeaemcloud.com, non utilizzare tale dominio in originSelectors. Invece:
- Installa un dominio personalizzato nell’ambiente AEMaaCS (ad esempio,
aem-publish-origin.example.com) che punta al servizio di pubblicazione. - Nella configurazione CDN, definisci un’origine con tale dominio personalizzato e instrada i percorsi desiderati (ad esempio,
/graphql) verso di esso.
kind: CDN
version: '1'
data:
originSelectors:
rules:
- name: graphql-to-aem-publish
when:
allOf:
- reqProperty: domain
equals: www.example.com
- reqProperty: originalPath
like: /graphql*
action:
type: selectOrigin
originName: aem-publish-origin
origins:
- name: aem-publish-origin
domain: aem-publish-origin.example.com
Reindirizzamenti lato server server-side-redirectors
Puoi utilizzare le regole di reindirizzamento lato client per 301, 302 e reindirizzamenti lato client simili. Se una regola corrisponde, la rete CDN risponde con una riga di stato che include il codice di stato e il messaggio (ad esempio, HTTP/1.1 301 Spostato definitivamente), nonché l’intestazione della posizione impostata.
Sono consentite posizioni sia assolute che relative con valori fissi.
Tieni presente che la dimensione cumulativa del file di configurazione, incluse le regole del filtro del traffico, non può superare i 100 KB.
Esempio di configurazione:
kind: "CDN"
version: "1"
data:
redirects:
rules:
- name: redirect-absolute
when: { reqProperty: originalPath, equals: "/page.html" }
action:
type: redirect
status: 301
location: https://example.com/page
- name: redirect-relative
when: { reqProperty: originalPath, equals: "/anotherpage.html" }
action:
type: redirect
location: /anotherpage
Le posizioni di un reindirizzamento possono essere valori letterali stringa (ad esempio, https://www.example.com/page) o il risultato di una proprietà (ad esempio, percorso) che viene facoltativamente trasformata con la seguente sintassi:
redirects:
rules:
- name: country-code-redirect
when: { reqProperty: path, like: "/" }
action:
type: redirect
location:
reqProperty: clientCountry
transform:
- op: replace
match: '^(.*)
replacement: 'https://www.example.com/\1/home'
- op: tolower
- name: www-redirect
when: { reqProperty: domain, equals: "example.com" }
action:
type: redirect
location:
reqProperty: url
transform:
- op: replace
match: '^/(.*)
replacement: 'https://www.example.com/\1'