設定郵件處理工具以允許重複的標頭

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

根據 HTTP 規格 RFC 7230 的第 3.2.2 節:欄位順序,Apigee Edge 會預期 來自後端伺服器的用戶端或 HTTP 回應與傳遞的相同標頭 擁有相同或不同的值,除非特定標頭有例外狀況 且可以重複。

根據預設,Apigee Edge 允許將重複項目和多個值傳遞至大部分的 HTTP 標題。不過,我們不允許 不得使用重複和多個值的標題。 因此:

  • 你將收到 400 Bad Request 提供的錯誤代碼 如果用戶端傳送含有特定要求的 HTTP 要求,則為 protocol.http.DuplicateHeader 或 HTTP 標頭有多個值,不允許 Apigee Edge 中有重複/多個值。
  • 同樣地,您會收到 502 Bad Gateway 及錯誤代碼 protocol.http.DuplicateHeader如果後端伺服器 或是 HTTP 標頭有多個值 因此 Apigee Edge 中可能含有重複或多個值

如要解決這些錯誤,建議的解決方案就是修正用戶端應用程式 和後端伺服器,不要傳送重複的標頭,並遵循規格 RFC 7230 的第 3.2.2 節:欄位順序,如以下疑難排解手冊所述:

不過,在某些情況下,可能要新增例外狀況,才能納入重複項目和多個項目 值。在這種情況下,可以允許重複和多個標頭 特定 HTTP 標頭的值,方法是將 HTTPHeader.HEADER_NAME 屬性設為 「訊息處理器」層級

本文件提供這項資源的相關資訊,說明如何將這項資源新增至 避免上述錯誤並分享最佳做法。

HTTP 標頭屬性允許重複項目和多個值

Apigee Edge 提供下列兩種屬性,可讓您控制 HTTP 標頭重複和多個值請注意,您只能在 訊息處理方會使用 如何設定 Edge

屬性名稱 說明 允許的值
HTTPHeader.ANY

這個屬性指出所有 HTTP 是否允許重複或多個值 包括在用戶端或 HTTP 送出 HTTP 要求時傳送的自訂標頭 回應。

預設值:

multivalued, allowDuplicate,

  1. blank:HTTP 標頭不可重複和使用多個值。
  2. multiValued:將多值標頭分割成多個標頭。 HTTP 標頭可以設定多個值,但不得重複。 已啟用 multiValued 值,表示 test-header=a,b 將會轉換為 test-header=atest-header=b.
  3. allowDuplicate:允許多個名稱相同的 HTTP 標頭 (重複)。
  4. multivalued, allowDuplicate:同時有多個值和重複的值 HTTP 標頭

HTTPHeader.HEADER_NAME

這個屬性可用來覆寫特定標頭的行為 由「HTTPHeader.ANY」指定

同上。

標頭不得使用重複和多個值

如先前所述,Apigee Edge 允許大部分的 HTTP 執行重複和多個值 標頭。這是因為屬性 HTTPHeader.ANY 設為「multivalued, allowDuplicate.」值

已覆寫設定

使用下列任一項目覆寫特定標頭的預設設定 方法:

  • HTTPHeader.HEADER_NAME=multivalued, allowDuplicate

    這項設定不會變更預設行為。 也就是說,這個特定標題可以重複和多個值

    ,直接在 Google Cloud 控制台實際操作。
  • HTTPHeader.HEADER_NAME=

    這項設定會變更預設行為。也就是 標題不得重複和多個值

,瞭解如何調查及移除這項存取權。

判斷不得使用重複和多個值的標頭

本節說明如何找出以下項目:

  • 不得使用重複和多個值 的特定標頭 在您的 Apigee Edge 私有雲設定中
  • 含有現有設定的特定標頭
  1. 在訊息處理器電腦上,搜尋位於HTTPHeader. /opt/apigee/edge-message-processor/conf 目錄,如下所示:

    grep -ri "HTTPHeader." /opt/apigee/edge-message-processor/conf
    

    輸出內容範例:

    # grep -ri "HTTPHeader" /opt/apigee/edge-message-processor/conf
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.ANY=allowDuplicates, multiValued
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Connection=allowDuplicates, multiValued
    … <snipped>
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Host=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Date=allowDuplicates
    …
    <snipped>
    
  2. 如「覆寫設定」一節所述, 請留意以上範例輸出內容中的下列資訊:
    1. HTTP 標頭 Connection 已覆寫,但允許 重複和多個值
    2. HTTP 標頭 HostExpires 已遭到覆寫, 不允許 重複項目和多個值
    3. HTTP 標頭「Date已覆寫,允許有重複的結果 但不是 可以有多個值
    4. 這裡顯示的所有標頭 (ConnectionHostExpiresDate 在上述範例中),則稱為具備既有設定的標頭 文件。
    ,瞭解如何調查及移除這項存取權。

Apigee Edge 的行為

下表說明以做為標頭傳送標頭的 Apigee Edge 行為 視 HTTPHeader 屬性的方式而定,具有多個重複值和多個值 範例 HTTPHeader 是「訊息處理器」中設定的 test-header

要求 傳出標題 (以 conf/http.properties+HTTPHeader.test-header= 的值為準)
<空白> allowDuplicate multiValued allowDuplicate、multiValued (預設)
test‑header=a,b test‑header=a,b test‑header=a,b

protocol.http.
DuplicateHeader

我們內部會將 test-header=a,b 分為:

  • test-header=a
  • test-header=b,

然後,系統會擲回 DuplicateHeader 錯誤。

test‑header=a,b

我們內部會將 test-header=a,b 分為:

  • test-header=a
  • test-header=b,

並將原始表單傳送到指定目標

test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b
protocol.http.
DuplicateHeader
test‑header=a
test‑header=b

事前準備

使用本文件中的步驟前,請務必瞭解 私有雲中的邊緣,說明 如何設定 Edge

為標頭設定 allowDuplicates 和多個值

HTTP 標頭屬性中允許重複項目及 多個值,如果 HTTPHeader.ANY = allowDuplicates, multivalued 屬性的值具有多個值,表示所有標頭皆可包含重複和多個值 Apigee Edge。不過,某些標頭的值會明確遭到覆寫, 允許針對 Thi 使用 屬性進行重複標題或多個值 HTTPHeader.HEADER_NAME

本節說明如何設定資源 HTTPHeader.HEADER_NAME:允許任何值重複和多個值 這類 HTTP 標頭,按照語法 如如何設定 Edge 一文所述。

在本節中,我們將使用 Expires (和 myheader) 做為範例 允許使用重複值和多個值的標題,說明如下:

  1. 判斷 HTTPHeaderHEADER_NAME 屬性目前的值 ,以確定該功能尚未啟用允許重複和多個值的功能 以下指令:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    例如,如果要設定 Expires 標頭的屬性,則 檢查訊息上屬性 HTTPHeader.Expires 權杖目前的值 處理器:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    上述指令的輸出內容會產生下列其中一項:

    1. 屬性設為空白,則表示該值遭到覆寫 ( 是含有現有設定的標頭),「不允許」重複和多個標頭 輕鬆分配獎金也就是說,傳送 Expires 標頭時, 加入到 Apigee 的 HTTP 要求或 HTTP 回應中
    2. 特定資源中沒有任何命中,因此該值不會 覆寫 (且「不是」具有既有設定的標頭)。也就是說 向 Apigee Edge 發出 HTTP 要求或 HTTP 回應
    3. 這項屬性設為 allowDuplicates, multivalued 值,然後 這表示該值明確遭到覆寫 (也就是 現有設定)。也就是說,該特定標頭可能會傳送 一次 (允許重複)。

    搜尋指令的輸出內容範例:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    

    上述範例輸出內容顯示屬性 HTTPHeader.Expires 已設為 空白。這表示屬性被覆寫以便不允許重複 或多個值 標頭 Expires

  2. 如果您發現對應至特定標頭的屬性 覆寫不允許重複或多個值,如範例所示 ,然後執行下列步驟。如未明確指定 然後略過本節的其餘步驟。
  3. 編輯。如果該值區不存在,您可以按照下列步驟建立它:
    /opt/apigee/customer/application/message-processor.properties
    

    舉例來說,如果要使用 vi 中輸入以下內容:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. 按照以下格式新增一行:
    conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
    
  5. 儲存變更。
  6. 確認屬性檔案是由 apigee 使用者所擁有。 如果沒有,請執行下列指令:

    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. 重新啟動訊息處理器:

    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    如要在不影響流量的情況下重新啟動,請參閱 訊息處理器逐步重新啟動,不影響流量。

  8. 如果您有多部訊息處理器,請針對所有 訊息處理器。

確認標頭已設為含有重複和多個值

本節將說明如何驗證資源 特定標頭的「HTTPHeader.HEADER_NAME」已更新 成功允許訊息處理器中的重複項目。

我們會使用 Expires 做為標頭範例,並檢查對應的屬性 HTTPHeader.Expires 已更新。

即使您使用 conf_http_HTTPHeader.Expires 符記 訊息處理者,您必須驗證實際屬性 HTTPHeader.Expires 已經設定新的值

  1. 在訊息處理器電腦上搜尋屬性 HTTPHeader.HEADER_NAME/opt/apigee/edge-message-processor/conf 目錄,並查看該目錄是否 已經設定新的值,如下所示:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    舉例來說,如果您想檢查 HTTPHeader.Expires 屬性是否已設定完成, 然後執行下列指令:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    
  2. 如果已在 HTTPHeader.HEADER_NAME 成功設定新的值 訊息處理器,上述指令會顯示 http.properties 檔案。
  3. 設定完成後,上方指令的範例結果 allowDuplicatesmultiValued 如下所示:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    
  4. 在上述的輸出範例中,請注意,HTTPHeader.Expires 屬性已 將新值設為 allowDuplicates, multiValued http.properties。這表示允許重複和多個關鍵字 已成功在訊息處理器上設定 HTTPHeader 中的值。
  5. 如果仍看到 HTTPHeader.HEADER_NAME 屬性的舊值, 請確認您已遵循 正確設定 allowDuplicates 和多個標頭值。 如果您漏掉任何步驟,請再次正確重複所有步驟。

    確認您的 Proxy 運作正常,尤其是在有函式邏輯的情況下 取得及設定 Proxy 的標頭

  6. 如果仍無法修改屬性,請與 Apigee Edge 支援團隊聯絡

停用標頭的 allowDuplicates

本節說明如何將屬性 HTTPHeader.{Headername} 設定為 不允許訊息中特定的 HTTP 標頭重複項目和多個值 處理方,根據 如何設定 Edge

在本節中,我們將使用 Expires (和 myheader) 做為範例 我們不允許使用重複廣告的標題,如下所述:

  1. 判斷 HTTPHeaderHEADER_NAME 屬性目前的值 確認並未停用,以允許重複和多個值。 使用以下指令:
    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    舉例來說,如要設定 Expires 標頭的屬性,請勾選 訊息處理器上屬性 HTTPHeader.Expires 權杖目前的值:

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    上述指令的輸出內容會產生下列其中一項:

    1. 這個屬性設為空白,表示值被覆寫為 NOT 允許重複標題和多個值;因此您無法傳送 在 HTTP 要求或 HTTP 回應中重複出現 Expires 標頭 到 Apigee
    2. 特定資源中沒有任何命中,因此該值不會 覆寫,而這是現有設定的 NOT 標頭。也就是說 讓指定的標頭可以多次傳送 (可以重複), 向 Apigee Edge 發出的 HTTP 要求或 HTTP 回應。
    3. 這項屬性設為 allowDuplicates, multivalued 值,接著是 表示該值已明確覆寫,且這是現有設定。 但這也意味著,該特定標頭可以重複傳送 (重複 ) 做為向 Apigee 發出的 HTTP 要求或 HTTP 回應的一部分。

    輸出內容範例 #1

    搜尋指令的輸出內容 #1 範例:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
    

    範例輸出內容顯示屬性 HTTPHeader.Expires 已設為 allowDuplicates, multiValued。這表示該屬性 允許重複或多個值 Expires

    輸出內容範例 #2

    搜尋指令的指令與輸出內容 #2

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    

    範例輸出內容不會顯示任何輸出內容,表示其屬性為 HTTPHeader.myheader 目前預設為 allowDuplicates, multiValued。 這也表示標頭 myheader 的「不會覆寫」屬性

  2. 如果您注意到以下任一種情況,請執行本節的其餘步驟:
    1. 系統會覆寫與特定標頭的對應屬性,以便允許 重複和多個值,如上方的輸出內容範例 #1 中所述 (含有 現有設定)
    2. 對應到特定標題的資源沒有命中,如 上方的輸出內容範例 #2 (非含有現有設定的標頭)

    否則,請略過本節的其餘步驟。

  3. 編輯下列檔案。如果該值區不存在,您可以加以建立。
    /opt/apigee/customer/application/message-processor.properties
    

    舉例來說,如果要使用 vi 中輸入以下內容:

    vi /opt/apigee/customer/application/message-processor.properties
    
  4. 在屬性檔案中加入以下格式的一行:

    現有設定

    情境 #1:包含現有設定的標頭:

    conf_http_HTTPHeader.Expires=
    

    沒有任何現有設定

    情境 2:並非已既有設定的標頭:

    conf/http.properties+HTTPHeader.myheader=
    
  5. 儲存變更。
  6. 確認屬性檔案是由 apigee 使用者所擁有。如果不是 執行下列指令:
    chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
    
  7. 重新啟動訊息處理器:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
    

    如要在不影響流量的情況下重新啟動,請參閱 訊息處理器逐步重新啟動,不影響流量。

  8. 如果您有多部訊息處理器,請針對所有「訊息」重複上述步驟。 處理器:

確認標頭已設為不允許重複和多個值

本節將說明如何驗證資源 特定標頭的「HTTPHeader.HEADER_NAME」已更新 不允許「訊息處理器」中重複出現。

我們會使用 Expires (和 myheader) 做為標頭範例,並檢查是否符合 對應的屬性 HTTPHeader.Expires HTTPHeader.myheader) 已更新。

  1. 在訊息處理器電腦上搜尋屬性 /opt/apigee/edge-message- processor/conf 目錄中的 HTTPHeader.HEADER_NAME,並查看其是否已根據 如下所示:

    grep -ri "HTTPHeader.HEADER_NAME" /opt/apigee/edge-message-processor/conf
    

    舉例來說,如果您要檢查 HTTPHeader.Expires 屬性已設為 新值,接著您可以執行以下指令:

    現有設定

    grep -ri "HTTPHeader.Expires" /opt/apigee/edge-message-processor/conf
    

    沒有任何現有設定

    grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
    
  2. 如果 HTTPHeader.HEADER_NAME 我是指訊息處理器,接著是 這個指令會顯示 http.properties 檔案中的新值。
  3. 停用後,上述指令的範例結果 allowDuplicates 如下所示:

    現有設定

    情境 1Expiration 標頭 (含有 pre-existing config 的標頭)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
    

    沒有任何現有設定

    情境 2:myheader 標頭 (非現有設定的標頭)

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.myheader=
    
  4. 在上方的輸出範例中,請注意 HTTPHeader.Expires 屬性 ( 和 HTTPHeader.myheader) 已在blank} http.properties。這表示允許重複和 特定 HTTP 標頭 Expires (和 myheader) 的多個值 已成功停用訊息處理器
  5. 如果仍看到 HTTPHeader.Expires (or HTTPHeader.myheader) 屬性的舊值,請確認您已按照下文所述的所有步驟操作 設定標頭的 allowDuplicates 和多個值 正確。如果您漏掉任何步驟,請再次正確重複所有步驟。

    確認您的 Proxy 運作正常,尤其是有功能邏輯時 取得並設定 Proxy 的標頭。

  6. 如果仍無法修改屬性,請與 Apigee Edge 支援團隊聯絡。