在使用Google Cloud HTTPS负载均衡器时,我们遇到了以下错误。无法找到相关信息。
我们的请求中有自定义的http标头:
X-<Company name>-abcde
。如果我们直接对服务器工作一切都很好,但是一旦我们正在完成负载均衡器,我们的自定义标头就会丢失。我们在文档中没有找到任何参考资料,表明我们需要列出标题或类似内容。
为什么在使用Google Cloud Load Balancer时我的自定义标头没有传输到我的后端服务器?以及如何使其发挥作用?
由于
答案 0 :(得分:4)
经过大量测试后,这些是我提出的结果:
因此,在您的情况下,X-Custom-Header
会转换为x-custom-header
。
据我所知,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 )
。