您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
根据 HTTP 规范 RFC 7230 第 3.2.2 节:字段顺序,Apigee Edge 要求来自客户端的 HTTP 请求或来自后端服务器的 HTTP 响应不包含以相同或不同的值多次传递的相同标头,除非特定标头存在异常且允许有重复。
默认情况下,Apigee Edge 允许向大多数 HTTP 标头传递重复项和多个值。但是,它不允许使用不允许具有重复和多个值的标头中列出的某些标头。 因此:
- 如果客户端多次发送包含特定标头或包含多个 HTTP 标头值的 HTTP 标头(这些标头不允许在 Apigee Edge 中使用重复/多个值),您会收到错误代码
protocol.http.DuplicateHeader
的400 Bad Request
。 - 同样,如果后端服务器多次发送包含特定标头的 HTTP 响应,或包含多个 HTTP 标头值的 HTTP 标头(这些标头不允许在 Apigee Edge 中使用重复或多个值),您将获得
502 Bad Gateway
错误代码protocol.http.DuplicateHeader
解决这些错误的推荐解决方案是修复客户端应用和后端服务器,使其不发送重复标头,并遵循 RFC 7230 第 3.2.2 节:字段顺序规范,如以下问题排查策略方案中所述:
但在某些情况下,您可能需要添加异常,以便为某些 HTTP 标头添加重复值和多个值。在这种情况下,您可以通过在消息处理器级别设置 HTTPHeader.HEADER_NAME
属性来允许特定 HTTP 标头使用重复的标头和多个值。
本文档提供了有关此属性的信息,并说明了如何启用此属性以避免上述错误,并分享了与此相关的最佳实践。
允许存在重复和多个值的 HTTP 标头属性
Apigee Edge 提供以下两个属性来控制允许 HTTP 标头出现重复值和多个值的行为。请注意,您只能使用如何配置 Edge 中所述的令牌语法在消息处理器上配置这些设置。
属性名称 | 说明 | 允许的值 |
---|---|---|
HTTPHeader.ANY |
此属性指示所有 HTTP 标头(包括作为客户端发出的 HTTP 请求的一部分发送的自定义标头或后端服务器发送到 Apigee Edge 的 HTTP 响应时发送的自定义标头)允许使用重复值或多个值。 默认值:
|
|
|
此属性用于根据 |
同上。 |
标头不得包含重复值和多个值
如前所述,默认情况下,Apigee Edge 允许大多数 HTTP 标头使用重复和多个值。这是因为 HTTPHeader.ANY
属性配置了值 multivalued, allowDuplicate.
配置被覆盖
对于某些特定头文件,请使用以下方法之一覆盖默认配置:
HTTPHeader.HEADER_NAME=multivalued, allowDuplicate
此配置不会更改默认行为。 也就是说,特定标头可以具有重复和多个值
.HTTPHeader.HEADER_NAME=
此配置会更改默认行为。也就是说,特定标头不得包含重复值和多个值。
确定不允许包含重复值和多个值的标题
本部分介绍了如何识别以下内容:
- 在 Apigee Edge Private Cloud 设置中,不允许有重复和多个值 的特定标头,以及
- 采用现有配置的特定标头
在消息处理器机器上,在
/opt/apigee/edge-message-processor/conf
目录中搜索HTTPHeader.
属性,如下所示: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
)。
请求 | 传出 HeaderS(基于 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 |
准备工作
在使用本文档中的步骤之前,请确保您已了解为 Private Cloud 配置 Edge 的属性,如 如何配置 Edge 中所述。
为标头配置 allowDuplicates 和多个值
如允许存在重复和多个值的 HTTP 标头属性中所述,属性 HTTPHeader.ANY = allowDuplicates,
multivalued
的值意味着允许所有标头在 Apigee Edge 中具有重复和多个值。不过,对于某些标头,其值会被明确覆盖,从而不允许使用 HTTPHeader.HEADER_NAME
属性为其添加重复的标头或多个值。
本部分介绍了如何根据如何配置 Edge 中所述的语法,使用相应的令牌配置 HTTPHeader.HEADER_NAME
属性,以允许消息处理器上的任何此类 HTTP 标头出现重复和多个值。
在本部分中,我们将使用 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
上述命令的输出会导致以下结果之一:
- 如果该属性设置为空白,则表示该值会被覆盖(这是一个包含现有配置的标头),从而不允许出现重复的标头和多个值。也就是说,您不能在 HTTP 请求或 HTTP 响应中向 Apigee 发送多次
Expires
标头。 - 特定媒体资源没有命中,这意味着该值不会被覆盖(而且这不是包含现有配置的标头)。这意味着,特定标头可以作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee Edge,且发送多次(允许重复)。
- 此属性设置为使用
allowDuplicates, multivalued
值,这意味着该值将明确覆盖 (这是一个具有现有配置的标头)。这意味着,特定标头可能会作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee,并发送多次(允许重复)。
搜索命令的输出示例:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
上面的示例输出显示属性
HTTPHeader.Expires
设置为空白。这意味着属性会被覆盖,以不允许标头Expires
出现重复或多个值。 - 如果该属性设置为空白,则表示该值会被覆盖(这是一个包含现有配置的标头),从而不允许出现重复的标头和多个值。也就是说,您不能在 HTTP 请求或 HTTP 响应中向 Apigee 发送多次
- 如果您发现与特定标头对应的属性已被明确覆盖,以不允许出现重复或多个值(如上面的示例输出所示),只有这样才能执行以下步骤。如果未明确覆盖该文件,请跳过本部分的其余步骤。
- 修改。如果没有,您可以按以下步骤创建:
/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
是否已设为新值。
- 在消息处理器机器上,在
/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
- 如果在消息处理器上成功为
HTTPHeader.HEADER_NAME
设置新值,则上述命令会在http.properties
文件中显示新值。 配置
allowDuplicates
和multiValued
后,上述命令的示例结果如下所示:/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=allowDuplicates, multiValued
- 请注意,在上面的示例输出中,属性
HTTPHeader.Expires
已使用http.properties
中的新值allowDuplicates, multiValued
进行设置。这表示HTTPHeader
中允许重复和多个值的行为已在消息处理器上成功配置。 - 如果您仍然看到属性
HTTPHeader.HEADER_NAME
的旧值,请验证是否已正确遵循为标头配置 allowDuplicates 和多个值中所述的所有步骤。 如果您遗漏了任何步骤,请重新正确重复所有步骤。确保您的代理按预期运行,尤其是当需要具有可用于获取和设置代理中的标头的功能逻辑时。
- 如果您仍无法修改媒体资源,请与 Apigee Edge 支持团队联系
为标头停用 allowDuplicates
本部分说明了如何根据如何配置 Edge 中所述的语法,使用相应的令牌将 HTTPHeader.{Headername}
属性配置为不允许消息处理器上的特定 HTTP 标头出现重复和多个值。
在本部分中,我们将使用 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 响应中向 Apigee 发送多次
Expires
标头。 - 特定媒体资源没有命中,这意味着该值不会被覆盖,并且这是一个包含现有配置的 NOT 标头。这意味着,特定标头可以作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee Edge,且发送多次(允许重复)。
- 此属性使用值
allowDuplicates, multivalued
进行设置,这意味着该值会被明确覆盖,且这是一个现有配置。 但是,这意味着特定标头可以作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee,并发送多次(允许重复)。
示例输出 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 响应中向 Apigee 发送多次
- 如果您看到以下某一情况,请执行本部分的其余步骤:
否则,请跳过本部分的其余步骤。
- 修改以下文件。如果不存在,您可以创建一个。
/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
I 成功设置了新的 HTTP 标头值,则上述命令会在http.properties
文件中显示新值。 - 停用
allowDuplicates
后,上述命令的示例结果如下所示:现有配置
场景 1:到期标头(包含现有配置的标头)
/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
)已使用http.properties
中的新值 {blank}
进行设置。这表示消息处理器中已成功停用允许特定 HTTP 标头Expires
(和myheader
)重复和多个值的行为。 如果您仍然看到属性
HTTPHeader.Expires (or HTTPHeader.myheader)
的旧值,请确认您已正确按照为标头配置 allowDuplicates 和多个值中所述的所有步骤。如果您遗漏了任何步骤,请重新正确重复所有步骤。确保您的代理按预期运行,尤其是当代理中有可用于获取和设置标头的功能逻辑时。
- 如果您仍无法修改媒体资源,请与 Apigee Edge 支持团队联系。