設定 CDN 上的流量 cdn-configuring-cloud

AEM as a Cloud Service提供可在Adobe管理的CDN層設定的功能集合,可修改傳入要求或傳出回應的性質。 下列規則(在本頁中詳細說明)可宣告為達成下列行為:

在CDN也可以設定的是流量篩選規則(包括WAF),其可控制CDN允許或拒絕的流量。 此功能已發行,您可以在流量篩選器規則(包括WAF規則)頁面中瞭解更多相關資訊。

此外,如果CDN無法連絡其來源,您可以撰寫規則來參考自行託管的自訂錯誤頁面(然後呈現)。 閱讀設定CDN錯誤頁面文章以進一步瞭解此專案。

所有這些在原始檔控制的設定檔案中宣告的規則,都是使用Cloud Manager 設定管道來部署。 請注意,設定檔案的累積大小(包括流量篩選規則)不得超過100KB。

如需常見案例的其他程式碼片段,請參閱常見案例的CDN設定片段文章。

評估順序 order-of-evaluation

在功能上,先前提到的各種功能會依下列順序評估:

評估順序

設定 initial-setup

您必須先執行下列操作,才能在CDN設定流量:

  1. 建立名為cdn.yaml或類似的檔案,參考以下各節中的各種組態程式碼片段。

    所有程式碼片段都有這些通用屬性,在設定管道中加以說明。 kind屬性值應該是​CDN,且version屬性應該設定為​1

    code language-none
    kind: "CDN"
    version: "1"
    
  2. 將檔案放置在名為​ config ​或類似名稱的頂層資料夾之下,如設定管道所述。

  3. 在Cloud Manager中建立設定管道,如設定管道中所述。

  4. 部署設定。

規則語法 configuration-syntax

以下各節中的規則型別會共用相同語法。

一般規則語法是包含名稱、when條件以及一個或多個動作的清單專案:

- name: <name>
  when: <condition>
  action: <action>

流量篩選規則中的每個最上層區段(requestTransformationsresponseTransformationsredirectsoriginSelectorstrafficFilters)都支援其自己的動作型別和屬性集;允許的type值和欄位定義於該區段的表格和範例中,而不是在所有規則型別之間共用。 requestTransformationsresponseTransformations等區段支援在actions屬性下指定為yaml清單的多個動作。

「when」子句會根據包括網域、路徑、查詢字串、標頭和Cookie在內的屬性,決定是否評估規則。 各規則型別的語法相同;請參閱下面的條件結構。 流量篩選器規則(包括WAF)使用相同的條件語法;如需動作、速率限制和WAF專屬行為,請參閱流量篩選器規則(包括WAF規則) ​

條件結構 condition-structure

條件可以是一個簡單的條件,也可以是一個條件群組。

簡單條件

簡單條件由 getter 和述詞組成。

{ <getter>: <value>, <predicate>: <value> }

群組條件

條件群組由多個簡單和/或群組條件組成。

<allOf|anyOf>:
  - { <getter>: <value>, <predicate>: <value> }
  - { <getter>: <value>, <predicate>: <value> }
  - <allOf|anyOf>:
    - { <getter>: <value>, <predicate>: <value> }
屬性
類型
含義
allOf
array[Condition]
作業。 如果所有列出的條件都傳回 true,則為 true
anyOf
array[Condition]
作業。 如果任何列出的條件都傳回 true,則為 true

Getter

屬性
類型
說明
reqProperty
string

要求屬性。

之一:

  • path:傳回不包含查詢參數的 URL 完整路徑。 (使用未轉義變體的 pathRaw)
  • originalPath:傳回要求的不變原始路徑(不含查詢引數),亦即任何CDN要求轉換之前的路徑。
  • url:傳回含查詢參數的完整 URL。 (使用未轉義變體的 urlRaw)
  • originalUrl:傳回要求不可變的原始完整URL,包括查詢引數 — 任何CDN要求轉換之前的URL。
  • queryString:傳回 URL 的查詢部分
  • method:傳回要求中所使用的 HTTP 方法。
  • tier:傳回 authorpreviewpublish 其中之一。
  • domain:傳回小寫的網域屬性 (如 Host 標頭的定義)
  • clientIp:傳回用戶端 IP 位址。
  • forwardedDomain:傳回X-Forwarded-Host 標頭內定義的第一個小寫網域
  • forwardedIp:傳回 X-Forwarded-For 標頭中的第一個 IP 位址。
  • clientRegion:傳回國家/地區細分代碼,指出客戶所在的區域,如 ISO 3166-2 所述。
  • clientCountry:傳回兩個字母的代碼 (區域指示符),可識別客戶位於哪個國家/地區。
  • clientContinent:傳回兩個字母的代碼 (AF、AN、AS、EU、NA、OC、SA),可識別客戶位於哪個洲。
  • clientAsNumber:傳回與用戶端 IP 相關的自治系統編號。
  • clientAsName:傳回與自治系統編號相關的名稱。
reqHeader
string
傳回具有指定名稱的要求標頭
queryParam
string
傳回具有指定名稱的查詢參數
reqCookie
string
傳回具有指定名稱的 Cookie
postParam
string
從要求內文傳回具有指定名稱的 Post 參數。 只有當內文為內容類型 application/x-www-form-urlencoded 時才有效

述詞

屬性
類型
含義
等於
string
如果 getter 結果等於所提供的值,則為 true
doesNotEqual
string
如果 getter 結果不等於所提供的值,則為 true
like
string
如果 getter 結果和所提供的模式相符,則為 true
notLike
string
如果 getter 結果和所提供的模式不相符,則為 true
matches
string
如果 getter 結果和所提供的 regex 相符,則為 true
doesNotMatch
string
如果 getter 結果和所提供的 regex 不相符,則為 true
in
array[string]
如果所提供的清單包含 getter 結果,則為 true
notIn
array[string]
如果所提供的清單不包含 getter 結果,則為 true
存在
boolean
設定為 true 且屬性存在,或設為 false 且屬性不存在時為 true

附註

  • 要求屬性 clientIp 只能與以下述詞一起使用:equalsdoesNotEqualinnotInclientIp 也可以比對 IP 範圍 (在使用 innotIn 述詞時)。 以下範例將實施一項條件,以評估用戶端 IP 是否在 192.168.0.0/24 的 IP 範圍內 (即從 192.168.0.0 到 192.168.0.255):
when:
  reqProperty: clientIp
  in: [ "192.168.0.0/24" ]

動作節點的詳細資訊因規則型別而異,以下各節將概述這些詳細資訊。

在設定規則中,您可以參考定義為環境變數的密碼(請參閱設定密碼)。

要求轉換 request-transformations

請求轉換規則可讓您修改傳入的請求。 規則支援根據各種相符條件(包括規則運算式)來設定、取消設定和變更路徑、查詢引數和標頭(包括Cookie)。 您也可以設定變數,以便稍後在評估序列中參照。

使用案例多種多樣,包括URL重寫以簡化應用程式或對映舊版URL。

如前所述,組態檔有大小限制,因此需求較大的組織應在apache/dispatcher層定義規則。

設定範例:

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

動作

下表說明可用的動作。

名稱
屬性
含義
設定
reqProperty,值
設定指定的請求引數(只支援「path」屬性)
reqHeader,值
將指定的要求標頭設定為指定的值。
queryParam,值
將指定的查詢引數設定為指定值。
reqCookie,值
將指定的要求Cookie設定為指定的值。
logProperty,值
將指定的CDN記錄屬性設定為指定的值。
變數,值
將指定的變數設為指定值。
取消設定
reqProperty
移除指定的請求引數(只支援「path」屬性)
reqHeader,值
移除指定的請求標頭。
queryParam,值
移除指定的查詢引數。
reqCookie,值
移除指定的Cookie。
logProperty,值
移除指定的CDN記錄屬性。
變數
移除指定的變數。
queryParamMatch
移除符合指定規則運算式的所有查詢引數。
queryParamDoesNotMatch
移除不符合指定規則運算式的所有查詢引數。
轉換
op:replace, (reqProperty或reqHeader、queryParam或reqCookie或var),符合,取代
以新值取代部分請求引數(僅支援「path」屬性)、請求標頭、查詢引數、Cookie或變數。
op:tolower, (reqProperty或reqHeader、queryParam或reqCookie或var)
將請求引數(僅支援「path」屬性)、請求標頭、查詢引數、Cookie或變數設定為小寫值。

取代動作支援擷取群組,如下所示:

      - 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"

動作可以鏈結在一起。 例如:

actions:
    - type: transform
      reqProperty: path
      op: replace
      match: \.html$
      replacement: ""
    - type: transform
      reqProperty: path
      op: tolower

變數 variables

您可以在請求轉換期間設定變數,稍後在評估序列中參考它們。 如需詳細資訊,請參閱評估順序圖表。

設定範例:

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

記錄屬性 logproperty

您可以使用請求和回應轉換,在CDN記錄中新增您自己的記錄屬性。

設定範例:

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

記錄範例:

{
"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"
}

回應轉換 response-transformations

回應轉換規則可讓您設定和取消設定CDN傳出回應的標題、Cookie和狀態。 另請參閱上述範例,以參考先前在請求轉換規則中設定的變數。

設定範例:

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

動作

下表說明可用的動作。

名稱
屬性
含義
設定
respProperty,值
設定回應屬性。 僅支援「status」屬性以設定狀態代碼。
respHeader,值
將指定的回應標頭設定為給定的值。
respCookie,屬性(到期、網域、路徑、安全、httpOnly、副檔名)、值
將具有特定屬性的指定請求Cookie設定為給定值。
logProperty,值
將指定的CDN記錄屬性設定為指定的值。
變數,值
將指定的變數設為指定值。
取消設定
respHeader
從回應中移除指定的標頭。
respCookie,值
移除指定的Cookie。
logProperty,值
移除指定的CDN記錄屬性。
變數
移除指定的變數。

來源選取器 origin-selectors

您可以運用AEM CDN將流量路由至不同的後端,包括非Adobe應用程式(可能依路徑或子網域為基礎)。

要求屬性originalPathoriginalUrl分別是不可變的原始路徑(沒有查詢引數)和完整URL (包括查詢引數),在任何CDN 要求轉換之前執行。 當您需要將規則錨定在使用者端最初傳送的內容上時,請在when條件中使用它們,而不是在評估序列中較早重寫的值。 使用originalPath進行僅路徑比對;當查詢字串必須是條件的一部分時(例如,路由或篩選特定初始請求URL),請使用originalUrl

設定範例:

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

動作

可用動作如下表所述。

名稱
屬性
含義
selectOrigin
來源名稱
其中一個已定義來源的名稱。
skipCache (選用,預設為false)
標示是否將快取用於符合此規則的請求。 預設會根據回應快取標題(例如Cache-Control或Expires)快取回應
標頭(選擇性,預設為{}
包含其他HTTP標題的機碼值組,將於規則觸發時傳送至選取的後端。 鍵值與標頭名稱相對應,而值則與標頭值相對應
selectAemOrigin
來源名稱
其中一個預先定義AEM來源的名稱(支援的值: static)。
skipCache (選用,預設為false)
標示是否將快取用於符合此規則的請求。 預設會根據回應快取標題(例如Cache-Control或Expires)快取回應
標頭(選擇性,預設為{}
包含其他HTTP標題的機碼值組,將於規則觸發時傳送至選取的後端。 鍵值與標頭名稱相對應,而值則與標頭值相對應

來源

與來源的連線僅限SSL且使用連線埠443。

屬性
含義
名稱
可由「action.originName」參考的名稱。
網域
用來連線至自訂後端的網域名稱。 它也用於SSL SNI和驗證。
ip (選擇性,支援的iv4和ipv6)
若提供,可用來連線到後端而非「網域」。 仍會使用「網域」進行SSL SNI和驗證。
forwardHost (選擇性,預設為false)
若設為true,則會將使用者端請求的「Host」標頭傳送至後端,否則「domain」值將會傳送至「Host」標頭。
forwardCookie (選擇性,預設為false)
若設為true,則會將使用者端請求中的「Cookie」標頭傳遞至後端,否則會移除Cookie標頭。
forwardAuthorization (選擇性,預設為false)
如果設為true ,則會將使用者端請求中的"Authorization"標頭傳遞至後端,否則會移除Authorization標頭。
逾時 (選擇性,以秒為單位,預設為60)
CDN應等待後端伺服器傳遞HTTP回應本文第一個位元組的秒數。 此值也會用作後端伺服器的位元組逾時之間的值。
IMPORTANT
網域​值不可包含.adobeaemcloud.com。 您無法直接代理至adobeaemcloud.com網域。 此限制可防止不需要的請求回圈。 若要將流量代理到您的AEM as a Cloud Service環境,請改用安裝在AEMaaCS環境中的自訂網域作為原始後端。

將自訂網域代理至AEM靜態層 proxy-custom-domain-static

來源選取器可用來將AEM發佈流量路由到使用前端管道部署的AEM靜態內容。 使用案例包括在與頁面相同的網域(例如example.com/static)上或在明確不同的網域(例如static.example.com)上提供靜態資源。

以下是可實現此目標的原點選取器規則的範例:

kind: CDN
version: '1'
data:
  originSelectors:
    rules:
      - name: select-aem-static-origin
        when:
          reqProperty: domain
          equals: static.example.com
        action:
          type: selectAemOrigin
          originName: static

代理至Edge Delivery Services proxying-to-edge-delivery

在某些情況下,來源選擇器應該用於透過AEM Publish將流量路由到AEM Edge Delivery Services:

  • 部分內容是由AEM Publish管理的網域所傳送,而其他來自相同網域的內容是由Edge Delivery Services所傳送。
  • Edge Delivery Services傳送的內容可受益於透過設定管道部署的規則,包括流量篩選器規則或請求/回應轉換。
  • Edge Delivery設定管道可讓您定義如trafficFiltersoriginSelectorsredirects等規則,以設定Adobe管理的CDN設定。

以下是可實現此目標的原點選取器規則的範例:

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
NOTE
因為已使用Adobe Managed CDN,請依照Edge Delivery Services 安裝程式推送失效檔案,確定在​ Managed ​模式中設定推送失效。

代理至AEMaaCS環境 proxying-to-aemaacs

您不能直接使用adobeaemcloud.com網域做為CDN設定中的來源。 拒絕這麼做(網域不得包含.adobeaemcloud.com)以防止不需要的請求回圈。 當從為Edge Delivery網站安裝的網域進行路由時,這也適用。

如果您的自訂網域(www.example.com)已安裝至AEMaaCS環境,則預設路由會路由至AEM後端,而不會有任何CDN規則。 當您需要路由跨環境(例如,從pXXXX-eYYYYpXXXX-eZZZZ)或從Edge Delivery網站路由到AEMaaCS環境時,請使用來源選取器。

在這些情況下,若要將流量代理到您的AEM as a Cloud Service環境(例如,將特定路徑(例如/graphql)路由到後端),請在您的AEMaaCS環境中安裝自訂網域,並將該自訂網域用作CDN設定中的來源。

範例:​如果您可以在publish-pXXXXX-eYYYYY.adobeaemcloud.com存取您的AEM發佈層級,請勿在originSelectors中使用該網域。 請改為使用:

  1. 在您的AEMaaCS環境中安裝指向發佈服務的自訂網域(例如aem-publish-origin.example.com)。
  2. 在您的CDN設定中,使用該自訂網域定義來源,並將所需的路徑(例如/graphql)路由到該網域。
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

伺服器端重新導向 server-side-redirectors

對於301、302和類似的使用者端重新導向,您可以使用使用者端重新導向規則。 如果規則相符,CDN會以包含狀態代碼和訊息的狀態行回應(例如HTTP/1.1 301 Moved Permanently),以及位置標頭集。

允許使用固定值的絕對和相對位置。

請注意,設定檔案的累積大小(包括流量篩選規則)不得超過100KB。

設定範例:

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
名稱
屬性
含義
重新導向
位置
「Location」標頭的值。
狀態(選擇性,預設為301)
重新導向訊息中使用的HTTP狀態,預設為301,允許值為: 301、302、303、307、308。

重新導向的位置可以是字串常值(例如https://www.example.com/page),或是由以下語法選擇性轉換的屬性(例如path)所產生:

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'
recommendation-more-help
experience-manager-cloud-service-help-main-toc