在处理HTTP/1.1请求时,Envoy默认会将请求与响应的头部的Key都转化为小写,这对于一些依赖头部大小写的应用产生了很大影响。PreserveCase
插件在启用后,能够让网关与Sidecar保持其转发的请求/响应头部的大小写,以解决头部大小写敏感应用的服务网格依赖问题。
配置字段
名称 | 数据类型 | 填写要求 | 默认值 | 描述 |
request_or_response | string | 必填 | N/A | 该参数指定了要保留请求头还是响应头的大小写,有三个可能取值:
|
配置验证
部署客户端应用
部署客户端应用。
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
查看客户端应用运行状态。
kubectl get pod | grep sleep
预期输出:
sleep-77cb457458-c9mds 2/2 Running 0 10s
部署服务端应用
部署服务端应用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
查看服务端应用运行状态。
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-type
和content-length
被转换为了小写。
启用请求头大小写保持能力
您可以通过启用此插件或在控制台启用请求头大小写保持的能力。若您采用在控制台方式使用此能力,您还需要手动重启应用使能力生效。
kubectl rollout restart deploy/http-echo deploy/sleep
再次验证
验证请求头大小写保持。
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: 1 date: Tue, 19 Aug 2025 06:30:24 GMT server: envoy
可以看到,响应头中的
Content-Type
和Content-Length
仍然保持了大写。
相关信息
在ASM 1.25及以上版本,您可以通过修改网格配置信息的方式启用保持请求及响应头大小写的能力。具体步骤如下:
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在配置信息页签的数据面参数配置区域,单击保持请求与响应头大小写右侧的编辑。
在保持请求与响应头大小写窗口,单击开关,然后单击确定。
重要在启用能力后,您还需要重启应用使配置生效。