查看 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 要求時傳送的自訂標頭 回應。 預設值:
|
|
|
這個屬性可用來覆寫特定標頭的行為
由「 |
同上。 |
標頭不得使用重複和多個值
如先前所述,Apigee Edge 允許大部分的 HTTP 執行重複和多個值
標頭。這是因為屬性 HTTPHeader.ANY
設為「multivalued, allowDuplicate.
」值
已覆寫設定
使用下列任一項目覆寫特定標頭的預設設定 方法:
HTTPHeader.HEADER_NAME=multivalued, allowDuplicate
這項設定不會變更預設行為。 也就是說,這個特定標題可以重複和多個值
,直接在 Google Cloud 控制台實際操作。HTTPHeader.HEADER_NAME=
這項設定會變更預設行為。也就是 標題不得重複和多個值。
判斷不得使用重複和多個值的標頭
本節說明如何找出以下項目:
- 不得使用重複和多個值 的特定標頭 在您的 Apigee Edge 私有雲設定中
- 含有現有設定的特定標頭
在訊息處理器電腦上,搜尋位於
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>
- 如「覆寫設定」一節所述,
請留意以上範例輸出內容中的下列資訊:
- HTTP 標頭
Connection
已覆寫,但允許 重複和多個值 - HTTP 標頭
Host
和Expires
已遭到覆寫, 不允許 重複項目和多個值 - HTTP 標頭「
Date
」已覆寫,允許有重複的結果 但不是 可以有多個值 - 這裡顯示的所有標頭 (
Connection
、Host
、Expires
及Date
在上述範例中),則稱為具備既有設定的標頭 文件。
- HTTP 標頭
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 |
我們內部會將
然後,系統會擲回 |
我們內部會將
並將原始表單傳送到指定目標 |
test‑header=a test‑header=b |
protocol.http. |
test‑header=a test‑header=b |
protocol.http. |
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
) 做為範例
允許使用重複值和多個值的標題,說明如下:
-
判斷
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
上述指令的輸出內容會產生下列其中一項:
- 屬性設為空白,則表示該值遭到覆寫 (
是含有現有設定的標頭),「不允許」重複和多個標頭
輕鬆分配獎金也就是說,傳送
Expires
標頭時, 加入到 Apigee 的 HTTP 要求或 HTTP 回應中 - 特定資源中沒有任何命中,因此該值不會 覆寫 (且「不是」具有既有設定的標頭)。也就是說 向 Apigee Edge 發出 HTTP 要求或 HTTP 回應
- 這項屬性設為
allowDuplicates, multivalued
值,然後 這表示該值明確遭到覆寫 (也就是 現有設定)。也就是說,該特定標頭可能會傳送 一次 (允許重複)。
搜尋指令的輸出內容範例:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
上述範例輸出內容顯示屬性
HTTPHeader.Expires
已設為 空白。這表示屬性被覆寫以便不允許重複 或多個值 標頭Expires
。 - 屬性設為空白,則表示該值遭到覆寫 (
是含有現有設定的標頭),「不允許」重複和多個標頭
輕鬆分配獎金也就是說,傳送
- 如果您發現對應至特定標頭的屬性 覆寫到不允許重複或多個值,如範例所示 ,然後執行下列步驟。如未明確指定 然後略過本節的其餘步驟。
- 編輯。如果該值區不存在,您可以按照下列步驟建立它:
/opt/apigee/customer/application/message-processor.properties
舉例來說,如果要使用 vi 中輸入以下內容:
vi /opt/apigee/customer/application/message-processor.properties
- 按照以下格式新增一行:
conf_http_HTTPHeader.Expires=allowDuplicates, multiValued
- 儲存變更。
確認屬性檔案是由
apigee
使用者所擁有。 如果沒有,請執行下列指令:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
重新啟動訊息處理器:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
如要在不影響流量的情況下重新啟動,請參閱 訊息處理器逐步重新啟動,不影響流量。
- 如果您有多部訊息處理器,請針對所有 訊息處理器。
確認標頭已設為含有重複和多個值
本節將說明如何驗證資源
特定標頭的「HTTPHeader.HEADER_NAME
」已更新
成功允許訊息處理器中的重複項目。
我們會使用 Expires
做為標頭範例,並檢查對應的屬性
HTTPHeader.Expires
已更新。
即使您使用 conf_http_HTTPHeader.Expires
符記
訊息處理者,您必須驗證實際屬性 HTTPHeader.Expires
已經設定新的值
- 在訊息處理器電腦上搜尋屬性
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
- 如果已在
HTTPHeader.HEADER_NAME
成功設定新的值 訊息處理器,上述指令會顯示http.properties
檔案。 設定完成後,上方指令的範例結果
allowDuplicates
和multiValued
如下所示:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- 在上述的輸出範例中,請注意,
HTTPHeader.Expires
屬性已 將新值設為allowDuplicates, multiValued
http.properties
。這表示允許重複和多個關鍵字 已成功在訊息處理器上設定HTTPHeader
中的值。 - 如果仍看到
HTTPHeader.HEADER_NAME
屬性的舊值, 請確認您已遵循 正確設定 allowDuplicates 和多個標頭值。 如果您漏掉任何步驟,請再次正確重複所有步驟。確認您的 Proxy 運作正常,尤其是在有函式邏輯的情況下 取得及設定 Proxy 的標頭
- 如果仍無法修改屬性,請與 Apigee Edge 支援團隊聯絡
停用標頭的 allowDuplicates
本節說明如何將屬性 HTTPHeader.{Headername}
設定為
不允許訊息中特定的 HTTP 標頭重複項目和多個值
處理方,根據
如何設定 Edge。
在本節中,我們將使用 Expires
(和 myheader
) 做為範例
我們不允許使用重複廣告的標題,如下所述:
-
判斷
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
上述指令的輸出內容會產生下列其中一項:
- 這個屬性設為空白,表示值被覆寫為 NOT
允許重複標題和多個值;因此您無法傳送
在 HTTP 要求或 HTTP 回應中重複出現
Expires
標頭 到 Apigee - 特定資源中沒有任何命中,因此該值不會 覆寫,而這是現有設定的 NOT 標頭。也就是說 讓指定的標頭可以多次傳送 (可以重複), 向 Apigee Edge 發出的 HTTP 要求或 HTTP 回應。
- 這項屬性設為
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 的「不會覆寫」屬性 。 - 這個屬性設為空白,表示值被覆寫為 NOT
允許重複標題和多個值;因此您無法傳送
在 HTTP 要求或 HTTP 回應中重複出現
- 如果您注意到以下任一種情況,請執行本節的其餘步驟:
否則,請略過本節的其餘步驟。
- 編輯下列檔案。如果該值區不存在,您可以加以建立。
/opt/apigee/customer/application/message-processor.properties
舉例來說,如果要使用 vi 中輸入以下內容:
vi /opt/apigee/customer/application/message-processor.properties
- 在屬性檔案中加入以下格式的一行:
現有設定
情境 #1:包含現有設定的標頭:
conf_http_HTTPHeader.Expires=
沒有任何現有設定
情境 2:並非已既有設定的標頭:
conf/http.properties+HTTPHeader.myheader=
- 儲存變更。
- 確認屬性檔案是由
apigee
使用者所擁有。如果不是 執行下列指令:chown apigee:apigee /opt/apigee/customer/application/message-processor.properties
- 重新啟動訊息處理器:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
如要在不影響流量的情況下重新啟動,請參閱 訊息處理器逐步重新啟動,不影響流量。
- 如果您有多部訊息處理器,請針對所有「訊息」重複上述步驟。 處理器:
確認標頭已設為不允許重複和多個值
本節將說明如何驗證資源
特定標頭的「HTTPHeader.HEADER_NAME
」已更新
不允許「訊息處理器」中重複出現。
我們會使用 Expires
(和 myheader
) 做為標頭範例,並檢查是否符合
對應的屬性 HTTPHeader.Expires
HTTPHeader.myheader
) 已更新。
在訊息處理器電腦上搜尋屬性
/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
- 如果
HTTPHeader.HEADER_NAME
我是指訊息處理器,接著是 這個指令會顯示http.properties
檔案中的新值。 - 停用後,上述指令的範例結果
allowDuplicates
如下所示:現有設定
情境 1:Expiration 標頭 (含有 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=
- 在上方的輸出範例中,請注意
HTTPHeader.Expires
屬性 ( 和HTTPHeader.myheader
) 已在blank}
http.properties
。這表示允許重複和 特定 HTTP 標頭Expires
(和myheader
) 的多個值 已成功停用訊息處理器 如果仍看到
HTTPHeader.Expires (or HTTPHeader.myheader)
屬性的舊值,請確認您已按照下文所述的所有步驟操作 設定標頭的 allowDuplicates 和多個值 正確。如果您漏掉任何步驟,請再次正確重複所有步驟。確認您的 Proxy 運作正常,尤其是有功能邏輯時 取得並設定 Proxy 的標頭。
- 如果仍無法修改屬性,請與 Apigee Edge 支援團隊聯絡。