前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >istio 常见问题: HTTP Header 大小写问题

istio 常见问题: HTTP Header 大小写问题

原创
作者头像
imroc
发布2021-05-07 10:12:39
3.5K0
发布2021-05-07 10:12:39
举报
文章被收录于专栏:云原生知识宇宙

本文摘自 istio 学习笔记

Envoy 默认会将 Header 转换为小写

Envoy 缺省会把 http header 的 key 转换为小写,例如有一个 http header Test-Upper-Case-Header: some-value,经过 envoy 代理后会变成 test-upper-case-header: some-value。这个在正常情况下没问题,RFC 2616 规范也说明了处理 HTTP Header 应该是大小写不敏感的。

可能依赖大小写的场景

通常 header 转换为小写不会有问题(符合规范),有些情况对 header 大小写敏感可能就会有问题,如:

  • 业务解析 header 依赖大小写。
  • 使用的 SDK 对 Header 大小写敏感,如读取 Context-Length 来判断 response 长度时依赖首字母大写。

Envoy 所支持的规则

Envoy 只支持两种规则:

  • 全小写 (默认使用的规则)
  • 首字母大写 (默认没有启用)

如果应用的 http header 的大小写完全没有规律,就没有办法兼容了。

这两种是可以的:

  • test-upper-case-header: some-value
  • Test-Upper-Case-Header: some-value

类似这种就没有办法兼容了:

  • Test-UPPER-CASE-Header: some-value

规避方案: 强制指定为 TCP 协议

我们可以将服务声明为 TCP 协议,不让 istio 进行七层处理,这样就不会更改 http header 大小写了,但需要注意的是同时也会丧失 istio 的七层能力。

如果服务在集群内,可以在 Service 的 port 名称中带上 "tcp" 前缀:

代码语言:txt
复制
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - number: 80
    name: tcp-web # 指定该端口协议为 tcp

如果服务在集群外,可以通过一个类似如下 ServiceEntry 将服务强制指定为 TCP Service,以避免 envoy 对其进行七层的处理:

代码语言:txt
复制
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: qcloud-cos
spec:
  hosts:
  - "private-1251349835.cos.ap-guangzhou.myqcloud.com"
  location: MESH_INTERNAL
  addresses:
  - 169.254.0.47
  ports:
  - number: 80
    name: tcp
    protocol: TCP
  resolution: DNS

更多协议指定方式请参考: 为服务显式指定协议

最佳实践: 使用 EnvoyFilter 指定 Header 规则为首字母大写

如果希望 Envoy 对某些请求开启 Header 首字母大写的规则,可以用 EnvoyFilter 来指定:

代码语言:txt
复制
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: http-header-proper-case-words
  namespace: istio-system
spec:
  configPatches:
  - applyTo: NETWORK_FILTER # http connection manager is a filter in Envoy
    match:
      # context omitted so that this applies to both sidecars and gateways
      listener:
        name: XXX # 指定 cos使用的listener name,可以从config_dump中查询到
        filterChain:
          filter:
            name: "envoy.http_connection_manager"
    patch:
      operation: MERGE
      value:
        name: "envoy.http_connection_manager"
        typed_config:
          "@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
          http_protocol_options:
            header_key_format:
              proper_case_words: {}

注意替换 listener name

建议

应用程序应遵循 RFC 2616 规范,对 Http Header 的处理采用大小写不敏感的原则。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Envoy 默认会将 Header 转换为小写
  • 可能依赖大小写的场景
  • Envoy 所支持的规则
  • 规避方案: 强制指定为 TCP 协议
  • 最佳实践: 使用 EnvoyFilter 指定 Header 规则为首字母大写
  • 建议
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档