PreserveCase插件

在处理HTTP/1.1请求时,Envoy默认会将请求与响应的头部的Key都转化为小写,这对于一些依赖头部大小写的应用产生了很大影响。PreserveCase插件在启用后,能够让网关与Sidecar保持其转发的请求/响应头部的大小写,以解决头部大小写敏感应用的服务网格依赖问题。

重要
  • 开启PreserveCase插件会覆盖您在目标规则中配置的连接池设置,请谨慎启用。

  • ASM 1.25及以上版本的实例无需使用此插件即可使用到保持请求头大小写的能力。具体操作,请参见相关信息

配置字段

名称

数据类型

填写要求

默认值

描述

request_or_response

string

必填

N/A

该参数指定了要保留请求头还是响应头的大小写,有三个可能取值:

  • REQUEST_HEADER:保持转发的请求头的大小写。

  • RESPONSE_HEADER:保持转发的响应头的大小写。

  • BOTH_HEADER:同时保持请求头与响应头的大小写。

配置验证

部署客户端应用

  1. 部署客户端应用。

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: sleep
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: sleep
      labels:
        app: sleep
        service: sleep
    spec:
      ports:
      - port: 80
        name: http
      selector:
        app: sleep
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: sleep
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: sleep
      template:
        metadata:
          labels:
            app: sleep
        spec:
          terminationGracePeriodSeconds: 0
          serviceAccountName: sleep
          containers:
          - name: sleep
            image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
            command: ["/bin/sleep", "infinity"]
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - mountPath: /etc/sleep/tls
              name: secret-volume
          volumes:
          - name: secret-volume
            secret:
              secretName: sleep-secret
              optional: true
    ---
    EOF
  2. 查看客户端应用运行状态。

    kubectl get pod | grep sleep

    预期输出:

    sleep-77cb457458-c9mds        2/2     Running   0          10s

部署服务端应用

  1. 部署服务端应用httpbin-echo,此应用会响应与请求相同的请求头。

    kubectl apply -f - <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: http-echo
      labels:
        app: http-echo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: http-echo
      template:
        metadata:
          labels:
            app: http-echo
        spec:
          containers:
          - name: http-echo
            image: registry-cn-hangzhou.ack.aliyuncs.com/dev/http-echo:latest
            ports:
            - containerPort: 8080
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: http-echo
    spec:
      selector:
        app: http-echo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
          name: http
      type: ClusterIP
    EOF
  2. 查看服务端应用运行状态。

    kubectl get pod | grep http-echo

    预期输出:

    http-echo-89d9b457f-pcctg     2/2     Running   0          20s

验证请求头大小写保持

从客户端向服务端发起请求。

kubectl exec -it deploy/sleep -- curl http-echo -H 'X-TEST: test'

预期输出:

GET / HTTP/1.1
host: http-echo
user-agent: curl/8.1.2
accept: */*
x-test: test

可以看到,x-test请求头被强制转成了小写。

验证响应体大小写保持

从客户端向服务端发起请求。

kubectl exec -it deploy/sleep -- curl http-echo -I

预期输出:

HTTP/1.1 200 OK
content-type: text/plain; charset=utf-8
content-length: 476
x-envoy-upstream-service-time: 7
date: Tue, 19 Aug 2025 06:33:51 GMT
server: envoy

可以看到,经过Envoy后的请求头中的content-typecontent-length被转换为了小写。

启用请求头大小写保持能力

您可以通过启用此插件或在控制台启用请求头大小写保持的能力。若您采用在控制台方式使用此能力,您还需要手动重启应用使能力生效。

kubectl rollout restart deploy/http-echo deploy/sleep

再次验证

  1. 验证请求头大小写保持。

    kubectl exec -it deploy/sleep -- curl http-echo -H 'X-TEST: test'

    预期输出:

    GET / HTTP/1.1
    Host: http-echo
    User-Agent: curl/8.1.2
    Accept: */*
    X-TEST: test

    可以看到,X-TEST请求头仍然保持了大写。

  2. 验证响应大小写保持。

    kubectl exec -it deploy/sleep -- curl http-echo -I

    预期输出:

    HTTP/1.1 200 OK
    Content-Type: text/plain; charset=utf-8
    Content-Length: 476
    x-envoy-upstream-service-time: 1
    date: Tue, 19 Aug 2025 06:30:24 GMT
    server: envoy

    可以看到,响应头中的Content-TypeContent-Length仍然保持了大写。

相关信息

ASM 1.25及以上版本,您可以通过修改网格配置信息的方式启用保持请求及响应头大小写的能力。具体步骤如下:

  1. 登录ASM控制台,在左侧导航栏,选择服务网格 > 网格管理

  2. 网格管理页面,单击目标实例名称,然后在左侧导航栏,选择网格实例 > 基本信息

  3. 配置信息页签的数据面参数配置区域,单击保持请求与响应头大小写右侧的编辑

  4. 保持请求与响应头大小写窗口,单击开关,然后单击确定

    重要

    在启用能力后,您还需要重启应用使配置生效。