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

时间:2017-01-25 10:49:55

标签: load-balancing google-cloud-platform

在使用Google Cloud HTTPS负载均衡器时,我们遇到了以下错误。无法找到相关信息。

我们的请求中有自定义的http标头: X-<Company name>-abcde。如果我们直接对服务器工作一切都很好,但是一旦我们正在完成负载均衡器,我们的自定义标头就会丢失。我们在文档中没有找到任何参考资料,表明我们需要列出标题或类似内容。

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

由于

3 个答案:

答案 0 :(得分:4)

数据

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

  1. Google Cloud HTTPS负载均衡器 将自定义HTTP标头传输到后端服务。
  2. 然而,更改小写
  3. 因此,在您的情况下,X-Custom-Header会转换为x-custom-header

    解决方案

    1. 只需更改代码即可阅读自定义HTTP标头的小写版本。这是一个简单的解决方案,但Google可能不会长期支持此解决方案(Google的文档中有一个字,因此可能会发生变更,恕不另行通知)。
    2. 请求Google改变这种特殊行为,或者至少在他们的文档中清楚地提到它。
    3. 多一点

      据我所知,RFC 2047为自定义HTTP标头指定了X-前缀,并为每个单词传播了大写字母的伪标准,已被弃用并替换为{{3它通常推荐X-前缀,并且没有提及有关自定义HTTP标头键名称中其余单词的任何内容。如果我是Google,我会更改此行为以按原样传递自定义HTTP标头 ,并让开发人员在设置字符串时处理这些字符串。

答案 1 :(得分:2)

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)负载均衡器所做的事情是可以接受的。

答案 2 :(得分:0)

这很可能是应用程序错误。

正如其他答案所述,HTTP标头名称区分大小写 。 Ime,标题每次都区分大小写,这是因为在应用程序调用堆栈中某处有一个请求包装。

这样的请求包装器在Java Servlet过滤器中很常见(通常是必需的)。对于包装中的标头名称,使用区分大小写的匹配(例如常规Java HashMap<String, T>())是一个常见的新手错误。

这就是我开始寻找您的错误的地方。

创建不区分大小写且不修改键的Java Map<String, T>的合理方法是使用new TreeMap<String, T>( String.CASE_INSENSITIVE_ORDER )