Google 缺少云负载平衡器自定义 http header
Google cloud load balancer custom http header is missing
在使用 Google 云 HTTPS 负载平衡器时,我们遇到了以下错误。找不到关于它的任何信息。
我们的请求中有一个自定义 http header:
X-<Company name>-abcde
。如果我们直接针对服务器工作,一切都很好,但是一旦我们通过负载均衡器工作,我们的自定义 header 就会丢失。我们没有在文档中找到任何需要将我们的 header 列入白名单或类似内容的参考资料。
为什么我的自定义 header 在通过 Google Cloud Load Balancer 工作时没有传输到我的后端服务器?以及如何让它发挥作用?
谢谢
数据
经过大量 测试,这些是我得出的结果:
- Google 云 HTTPS 负载平衡器 确实 将自定义 HTTP header 传输到后端服务。
- 但是,它将它们更改为lower-case。
因此,在您的情况下,X-Custom-Header
转换为 x-custom-header
。
解决方案
- 只需更改代码即可读取自定义 HTTP header 的 lower-case 版本。这是一个简单的修复,但 Google 在 long-term 中可能不支持该修复(在 Google 中 not 对此没有任何说明' s 文档,因此如有更改,恕不另行通知。
- 请愿 Google 改变这种特殊行为,或者至少在他们的文档中清楚地提及它。
一点额外
据我所知,RFC 2047 which specified the X-
prefix for custom HTTP headers and propagated the pseudo-standard of a capital letter for each word has been deprecated and replaced by RFC 6648 一般不建议使用 X-
前缀,并且没有提及自定义 HTTP header 键名中的其余词。如果我是 Google,我会更改此行为以按原样传递自定义 HTTP headers ,并让开发人员按照他们设置的方式处理字符串。
HTTP/1.1 消息语法和路由的 RFC (RFC 7230) 指出 header 字段有一个 case-insensitive 字段名称。如果您依赖大小写来匹配与 RFC 不一致的 header。
回想过去,我查看了 Jetty 源的 Tomcat,他们将所有内容都作为 .toLower()
。
Go 有一个 CanonicalMIMEHeaderKey,它将以通用方式格式化 header,以确保所有内容都在同一页上。
Python 仍然回到 RFC822 (hg.python.org/cpython/file/2.7/Lib/rfc822.py#l211) 天,但它强制 .lower()
在 header 秒内进行标准化。
基本上,就 RFC 而言,GCP HTTP(S) 负载平衡器所做的是可以接受的。
这很可能是应用程序错误。
如其他答案所述,HTTP header 名称区分大小写 in。 Ime,每次 headers 出现 sensitive,这是因为在应用程序调用堆栈中某处有一个请求包装器。
像这样的请求包装器在 Java servlet 过滤器中很常见(通常是必需的)。对包装器中的 header 名称使用 case-sensitive 匹配(例如常规 Java HashMap<String, T>()
)是一个常见的新手错误。
这就是我开始寻找您的错误的地方。
创建不区分大小写且不修改键的 Java Map<String, T>
的合理方法是使用 new TreeMap<String, T>( String.CASE_INSENSITIVE_ORDER )
.
在使用 Google 云 HTTPS 负载平衡器时,我们遇到了以下错误。找不到关于它的任何信息。
我们的请求中有一个自定义 http header:
X-<Company name>-abcde
。如果我们直接针对服务器工作,一切都很好,但是一旦我们通过负载均衡器工作,我们的自定义 header 就会丢失。我们没有在文档中找到任何需要将我们的 header 列入白名单或类似内容的参考资料。
为什么我的自定义 header 在通过 Google Cloud Load Balancer 工作时没有传输到我的后端服务器?以及如何让它发挥作用?
谢谢
数据
经过大量 测试,这些是我得出的结果:
- Google 云 HTTPS 负载平衡器 确实 将自定义 HTTP header 传输到后端服务。
- 但是,它将它们更改为lower-case。
因此,在您的情况下,X-Custom-Header
转换为 x-custom-header
。
解决方案
- 只需更改代码即可读取自定义 HTTP header 的 lower-case 版本。这是一个简单的修复,但 Google 在 long-term 中可能不支持该修复(在 Google 中 not 对此没有任何说明' s 文档,因此如有更改,恕不另行通知。
- 请愿 Google 改变这种特殊行为,或者至少在他们的文档中清楚地提及它。
一点额外
据我所知,RFC 2047 which specified the X-
prefix for custom HTTP headers and propagated the pseudo-standard of a capital letter for each word has been deprecated and replaced by RFC 6648 一般不建议使用 X-
前缀,并且没有提及自定义 HTTP header 键名中的其余词。如果我是 Google,我会更改此行为以按原样传递自定义 HTTP headers ,并让开发人员按照他们设置的方式处理字符串。
HTTP/1.1 消息语法和路由的 RFC (RFC 7230) 指出 header 字段有一个 case-insensitive 字段名称。如果您依赖大小写来匹配与 RFC 不一致的 header。
回想过去,我查看了 Jetty 源的 Tomcat,他们将所有内容都作为 .toLower()
。
Go 有一个 CanonicalMIMEHeaderKey,它将以通用方式格式化 header,以确保所有内容都在同一页上。
Python 仍然回到 RFC822 (hg.python.org/cpython/file/2.7/Lib/rfc822.py#l211) 天,但它强制 .lower()
在 header 秒内进行标准化。
基本上,就 RFC 而言,GCP HTTP(S) 负载平衡器所做的是可以接受的。
这很可能是应用程序错误。
如其他答案所述,HTTP header 名称区分大小写 in。 Ime,每次 headers 出现 sensitive,这是因为在应用程序调用堆栈中某处有一个请求包装器。
像这样的请求包装器在 Java servlet 过滤器中很常见(通常是必需的)。对包装器中的 header 名称使用 case-sensitive 匹配(例如常规 Java HashMap<String, T>()
)是一个常见的新手错误。
这就是我开始寻找您的错误的地方。
创建不区分大小写且不修改键的 Java Map<String, T>
的合理方法是使用 new TreeMap<String, T>( String.CASE_INSENSITIVE_ORDER )
.