<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
根据 HTTP 规范 <ph type="x-smartling-placeholder"></ph> RFC 7230 第 3.2.2 节:字段顺序),Apigee Edge 希望 来自后端服务器的客户端或 HTTP 响应未包含传递的相同标头 多次使用相同或不同的值,除非特定标头存在例外情况 可以有重复的关键字。
默认情况下,Apigee Edge 允许将重复项和多个值传递到大多数 HTTP 标头。但是,它不支持 标题不允许重复和多个值。 因此:
- 您会收到包含错误代码的
400 Bad Request
如果客户端发送包含特定数据的 HTTP 请求,则为protocol.http.DuplicateHeader
标头,或与不允许 在 Apigee Edge 中有重复/多个值。 - 同样,您会收到包含错误代码的
502 Bad Gateway
如果后端服务器发送包含以下内容的 HTTP 响应,则为protocol.http.DuplicateHeader
或使用多个 HTTP 标头的值 可以在 Apigee Edge 中拥有重复或多个值
要解决这些错误,推荐的解决方案是修复客户端应用 和后端服务器,请勿发送重复的标头并遵守相关规范 RFC 7230 第 3.2.2 节:字段顺序,如以下问题排查手册中所述:
- <ph type="x-smartling-placeholder"></ph> 400 请求无效 - 标头重复
- <ph type="x-smartling-placeholder"></ph> 502 Bad Gateway - Duplicate Header(502 无效网关 - 重复标头)
但在某些情况下,您可能需要添加例外情况,以包含重复项和多个
某些 HTTP 标头的值。在此类情况下,您可以允许使用重复的标头
特定 HTTP 标头的值,只需在HTTPHeader.HEADER_NAME
消息处理器级别。
本文档提供了有关此属性的信息,并说明了如何启用此属性以 避免上述错误,并分享与之相关的最佳实践。
允许使用重复项和多个值的 HTTP 标头属性
Apigee Edge 提供了以下两个属性来控制允许 API 访问 出现重复和多个 HTTP 标头值。请注意,您只能在 使用令牌语法的消息处理器(详见 如何配置 Edge。
属性名称 | 说明 | 允许的值 |
---|---|---|
HTTPHeader.ANY |
此属性指示所有 HTTP 网页是否允许使用重复值或多个值 标头,包括作为客户端或 HTTP 发出的 HTTP 请求的一部分发送的自定义标头 发送响应。 默认值:
|
|
|
该属性用于从
指定者: |
同上。 |
不允许包含重复项和多个值的标头
如前所述,Apigee Edge 允许大部分 HTTP 请求使用重复项和多个值,
标头。这是因为,HTTPHeader.ANY
属性
配置了值 multivalued, allowDuplicate.
配置已覆盖
对于某些特定标头,请使用以下某个标头覆盖默认配置 方法:
HTTPHeader.HEADER_NAME=multivalued, allowDuplicate
此配置不会更改默认行为。 也就是说,特定标头可以有多个重复值和多个值
.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>
- 如覆盖配置部分所述,
请注意上述示例输出中的以下信息:
<ph type="x-smartling-placeholder">
- </ph>
- 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= 的值的传出 HEADERS | |||
---|---|---|---|---|
<空白> | 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,如中所述 如何配置 Edge。
为标头配置 allowDuplicates 和多个值
<ph type="x-smartling-placeholder">如允许重复和
多个值,则属性 HTTPHeader.ANY = allowDuplicates,
multivalued
的值意味着允许所有标头包含重复项和多个值
Apigee Edge。不过,某些标头的值会被明确覆盖,以避免
使用该属性时,允许使用重复的标头或多个值
HTTPHeader.HEADER_NAME
。
本部分介绍了如何配置媒体资源
HTTPHeader.HEADER_NAME
- 允许任何对象包含重复项和多个值
消息处理器上的此类 HTTP 标头,根据语法使用相应的令牌
如何配置 Edge 中所述。
在本部分中,我们将以 Expires
(和 myheader
)为例
标头中,我们允许其出现重复项和多个值,具体如下所述:
- <ph type="x-smartling-placeholder"></ph>
确定
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
标头的次数不能超过 一次作为 HTTP 请求或 HTTP 响应的一部分发送到 Apigee。 - 特定媒体资源没有匹配数据,就意味着该值 覆盖(这并非具有原有配置的标头)。这意味着 特定标头可以多次发送(允许重复发送), 向 Apigee Edge 发送 HTTP 请求或 HTTP 响应。
- 该属性的值设置为
allowDuplicates, multivalued
,然后 这表示值会被明确覆盖 (此标头具有 预先存在的配置)。也就是说,特定标头的发送次数 一次(允许重复),作为对 Apigee 的 HTTP 请求或 HTTP 响应的一部分。
搜索命令的示例输出:
/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
若要在不影响流量的情况下重启,请参阅 <ph type="x-smartling-placeholder"></ph> 在不影响流量的情况下滚动重启消息处理器。
- 如果有多个消息处理器,请对所有 消息处理器。
验证标头是否已配置为包含重复项和多个值
<ph type="x-smartling-placeholder">
本部分介绍了如何验证
已更新特定标头的 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 和多个值。 如果您遗漏了任何步骤,请再次正确地重复所有步骤。 <ph type="x-smartling-placeholder">确保您的代理按预期运行,尤其是存在可用于 获取和设置代理中的标头。
- 如果您仍然无法修改属性,请联系 Apigee Edge 支持团队
停用标头的 allowDuplicates
本部分介绍了如何配置 HTTPHeader.{Headername}
属性,
在邮件中,不允许特定 HTTP 标头使用重复和多个值
处理方,根据 API 文档中所述语法使用相应的令牌
如何配置 Edge。
在本部分中,我们将以 Expires
(和 myheader
)为例
标头,如下所述:
- <ph type="x-smartling-placeholder"></ph>
确定
HTTPHeaderHEADER_NAME
属性的当前值 确保该复选框未被停用,以允许存在重复项和多个值 创建 Deploymentgrep -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
允许使用重复的标题和多个值。不允许发送
在 HTTP 请求或 HTTP 响应中多次使用
Expires
标头 到 Apigee。 - 特定媒体资源没有匹配数据,就意味着该值 覆盖,这是一个具有原有配置的 NOT 标头。这意味着 允许将特定标头作为 对 Apigee Edge 的 HTTP 请求或 HTTP 响应。
- 该属性的值设置为
allowDuplicates, multivalued
,则该值设为 表示值会被明确覆盖,并且这是一项现有配置。 不过,这意味着特定标头可以发送多次(重复 允许)作为 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 的属性, - 该属性设置为空,则表示值 i被覆盖为 NOT
允许使用重复的标题和多个值。不允许发送
在 HTTP 请求或 HTTP 响应中多次使用
- 如果您发现以下任一情况,请执行本部分中的其余步骤:
<ph type="x-smartling-placeholder">
否则,请跳过本部分中的其余步骤。
- 修改以下文件。如果不存在,您可以创建一个。
/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
若要在不影响流量的情况下重启,请参阅 <ph type="x-smartling-placeholder"></ph> 在不影响流量的情况下滚动重启消息处理器。
- 如果您有多个消息处理器,请对所有消息重复上述步骤 处理器。
验证标头是否已配置为不允许重复项和多个值
本部分介绍了如何验证
已更新特定标头的 HTTPHeader.HEADER_NAME
成功阻止消息处理器上出现重复项。
我们将使用 Expires
(和 myheader
)作为示例标头,并检查
相应的属性 HTTPHeader.Expires
(以及
HTTPHeader.myheader
)已更新。
在消息处理器计算机上,搜索属性
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
没有预先存在的配置
grep -ri "HTTPHeader.myheader" /opt/apigee/edge-message-processor/conf
- 如果针对
HTTPHeader.HEADER_NAME
我部署了消息处理器,然后发布了上述内容 命令会显示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}
http.properties
。这表示允许重复 特定 HTTP 标头Expires
的多个值(以及myheader
) 已成功停用消息处理器。 如果您仍然看到属性
<ph type="x-smartling-placeholder">HTTPHeader.Expires (or HTTPHeader.myheader)
的旧值,请验证您是否已按照 为标头配置 allowDuplicates 和多个值 正确。如果您遗漏了任何步骤,请再次正确地重复所有步骤。确保代理按预期运行,尤其是存在有效逻辑的情况下 来获取和设置代理中的标头。
- 如果您仍然无法修改该属性,请与 Apigee Edge 支持团队联系。