您正在查看 Apigee Edge 文档。
前往 Apigee X 文档。 信息
根据 HTTP 规范 RFC 7230 第 3.2.2 节:字段顺序,Apigee Edge 期望来自客户端的 HTTP 请求或来自后端服务器的 HTTP 响应不会多次传递同一标头(具有相同或不同的值),除非该特定标头有例外情况并允许重复。
默认情况下,Apigee Edge 允许将重复项和多个值传递给大多数 HTTP 标头。不过,它不允许使用不允许重复和具有多个值的标头中列出的某些标头。因此:
- 如果客户端发送的 HTTP 请求包含特定标头多次或包含不允许在 Apigee Edge 中包含重复项/多个值的 HTTP 标头的多个值,您将收到错误代码为
protocol.http.DuplicateHeader的400 Bad Request。 - 同样,如果后端服务器发送的 HTTP 响应中包含特定标头(在 Apigee Edge 中不允许重复或包含多个值的 HTTP 标头)且该标头出现多次或包含多个值,您将收到
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, allowDuplicates.
配置被覆盖
对于某些特定标头,可以使用以下方法之一覆盖默认配置:
HTTPHeader.HEADER_NAME=multiValued, allowDuplicates此配置不会更改默认行为。 也就是说,特定标头可以有重复值和多个值
.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 的示例。
| 请求 | 根据 conf/http.properties+HTTPHeader.test-header= 的值传出的标头 | |||
|---|---|---|---|---|
| <空白> | allowDuplicates | multiValued | allowDuplicates、multiValued(默认) | |
test‑header=a,b |
test‑header=a,b |
test‑header=a,b |
在内部,我们将
然后抛出 |
在内部,我们将
但随后原始表单会发送到目标。 |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
protocol.http. |
test‑header=atest‑header=b |
准备工作
在按照本文档中的步骤操作之前,请务必了解如何为 Edge on Private Cloud 配置属性,如 如何配置 Edge 中所述。
为标头配置 allowDuplicates 和多个值
如允许重复和多个值的 HTTP 标头属性中所述,属性 HTTPHeader.ANY = allowDuplicates,
multiValued 的值表示允许所有标头在 Apigee Edge 中具有重复值和多个值。不过,某些标头的值会被明确覆盖,以防止出现重复标头或多个值,这是通过使用属性 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
上述命令的输出结果如下之一:
- 如果该属性设置为空白,则表示该值会被覆盖(并且这是一个具有预先存在的配置的标头),以不允许重复的标头和多个值。也就是说,您不得在发送到 Apigee 的 HTTP 请求或 HTTP 响应中多次发送
Expires标头。 - 如果未找到特定属性的命中项,则表示该值未 被覆盖(并且这不是具有预先存在的配置的标头)。这意味着,特定标头可以作为发送到 Apigee Edge 的 HTTP 请求或 HTTP 响应的一部分多次发送(允许重复)。
- 如果该属性设置为值
allowDuplicates, multiValued,则 表示该值被显式覆盖 (并且这是一个具有 预先存在的配置的标头)。这意味着,特定标头可以作为 HTTP 请求或 HTTP 响应的一部分多次发送到 Apigee(允许重复)。
搜索命令的输出示例:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPHeader.Expires=
上述示例输出显示,属性
HTTPHeader.Expires设置为空白。这意味着,该属性会被覆盖,以不允许标头 出现重复值 或多个值Expires。 - 如果该属性设置为空白,则表示该值会被覆盖(并且这是一个具有预先存在的配置的标头),以不允许重复的标头和多个值。也就是说,您不得在发送到 Apigee 的 HTTP 请求或 HTTP 响应中多次发送
- 如果您发现与特定标头对应的属性被明确覆盖为不允许重复或多个值(如上面的示例输出所示),只有在这种情况下才执行以下步骤。如果未明确覆盖,则跳过本部分中的其余步骤。
- 修改。如果该目录不存在,您可以创建它:
/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
上述命令的输出结果如下之一:
- 如果该属性设置为空白,则表示值 i被覆盖为 NOT,以禁止重复的标头和多个值。也就是说,您不得在发送到 Apigee 的 HTTP 请求或 HTTP 响应中多次发送
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,属性 不会被覆盖 , - 如果该属性设置为空白,则表示值 i被覆盖为 NOT,以禁止重复的标头和多个值。也就是说,您不得在发送到 Apigee 的 HTTP 请求或 HTTP 响应中多次发送
- 如果您发现以下情况之一,请执行本部分中的其余步骤:
- 与特定标头对应的属性会被覆盖,以允许重复值和多个值,如上面的示例输出 1(具有预先存在的配置的标头)所示
- 没有与特定标头对应的媒体资源的命中数据,如上方的示例输出 #2 中所示(不是具有预先存在的配置的标头)
否则,请跳过本部分中的其余步骤。
- 修改以下文件。如果不存在,您可以创建该文件。
/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_NAMEI 设置新的 HTTP 标头值,则上述命令会在http.properties文件中显示新值。 - 停用
allowDuplicates后,上述命令的示例结果如下所示:现有配置
方案 1:Expires 标头(具有预先存在的配置的标头)
/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}inhttp.properties。这表示已在消息处理器上成功停用允许特定 HTTP 标头Expires(和myheader)重复和使用多个值的行为。 如果您仍然看到属性
HTTPHeader.Expires (or HTTPHeader.myheader)的旧值,请验证您是否已正确按照为标头配置 allowDuplicates 和多个值中所述的所有步骤操作。如果您遗漏了任何步骤,请再次正确重复所有步骤。确保您的代理按预期运行,尤其是在代理中存在用于获取和设置标头的功能逻辑时。
- 如果您仍然无法修改该属性,请与 Apigee Edge 支持团队联系。