Google云负载均衡器自定义http标头丢失

nhe*_*nn1 7 load-balancing google-cloud-platform

使用Google Cloud HTTPS负载平衡器时,我们遇到了以下错误。找不到任何相关信息。

我们的请求中有一个自定义的http标头: X-<Company name>-abcde。如果我们直接针对服务器工作,那么一切都很好,但是一旦我们通过负载平衡器工作,则缺少我们的自定义标头。我们没有在文档中找到任何需要白名单标题或类似内容的参考。

为什么在通过Google Cloud Load Balancer工作时我的自定义标头没有传输到后端服务器?以及如何使其工作?

谢谢

Sim*_*ote 5

数据

经过大量测试,这些是我得出的结果:

  1. Google Cloud HTTPS 负载平衡器确实将自定义 HTTP 标头传输到后端服务。
  2. 但是,它将它们更改小写

因此,在您的情况下,X-Custom-Header转换为x-custom-header.

解决方案

  1. 只需更改代码即可读取自定义 HTTP 标头的小写版本。这是一个简单的修复,但 Google 可能长期不支持该修复(Google 的文档中没有对此进行说明,因此如有更改,恕不另行通知)。
  2. 请求谷歌改变这种特殊行为,或者至少在他们的文档中清楚地提到它。

一点额外

据我所知,RFC 2047指定了X-自定义 HTTP 标头的前缀并为每个单词传播了大写字母的伪标准已被弃用并由RFC 6648取代,该RFC 6648一般建议反对X-前缀,并且没有提及任何关于自定义 HTTP 标头键名中的其余单词。如果我是 Google,我会更改此行为以按原样传递自定义 HTTP 标头并让开发人员按照他们设置的方式处理字符串。

  • HTTP 标头名称不区分大小写 (RFC 7230),因此 Google 的行为符合标准。通过以区分大小写的方式查找标头,应用程序没有遵循标准。 (3认同)

小智 5

用于 HTTP/1.1 消息语法和路由的 RFC ( RFC 7230 ) 说头字段具有不区分大小写的字段名称。如果您依赖大小写来匹配与 RFC 不一致的标头。

回到那天,我查看了 Jetty 源代码中的任何一个 Tomcat,他们将所有内容都作为.toLower().

Go 有一个CanonicalMIMEHeaderKey,它将以一种通用的方式格式化标题,以确保所有内容都在同一页面上。

Python 仍然回到 RFC822 (hg.python.org/cpython/file/2.7/Lib/rfc822.py#l211) 天,但它强制.lower()标头标准化。

基本上,尽管就 RFC 而言,GCP HTTP(S) 负载均衡器正在做的事情是可以接受的。