通过VirtualService资源自定义请求头和响应头

ASM支持通过Virtual Service的headers字段来自定义请求头(request headers)和响应头(response headers)。Virtual Service允许您在路由级别添加、修改或删除HTTP头信息,从而实现对头信息的定制化处理。

前提条件

部署httpbin应用

步骤一:定义VirtualService资源

VirtualService可以满足大多数常见的头部操作需求,如简单地添加、修改或删除请求头和响应头。例如,它不仅支持将头部值设定为固定的静态字符串,还能够通过内置表达式动态生成请求和响应头部的值。这些表达式通常使用%符号包裹,可以引用请求属性等不同的动态内容。用于访问日志记录的所有HTTP命令运算符都可以在自定义请求或响应标头中指定,例如%UPSTREAM_CLUSTER%表示服务提供方的名称。更多信息,请参见config-access-log-command-operators

您可以基于路由规则定制请求和响应的HTTP头部信息。这对于跟踪、日志记录、添加安全头部或实施特定的业务逻辑等情况非常有用。以下是一个Virtual Service的配置示例,说明如何自定义请求头和响应头。配置说明如下:

类型

说明

请求头

  • 添加x-custom-request-header,并设定值为"custom-value"

  • 设置x-another-request-header的值为"another-value"。如果该请求头已存在,其值将会被覆盖;如果不存在,将会添加该请求头。

  • 移除x-unwanted-header请求头。

响应头

  • 添加x-custom-response-header,并设定值为"custom-response-value"

  • 设置x-another-response-header的值为"another-response-value"。如果该响应头已存在,其值将会被覆盖;如果不存在,将会添加该响应头。

  • 移除x-unwanted-response-heade响应头。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin-vs
spec:
  gateways:
    - httpbin
  hosts:
    - '*'
  http:
  - route:
    - destination:
        host: httpbin
        port:
          number: 8000
      weight: 100
    headers:
      request:
        add:
          x-custom-request-header: "custom-value" # 添加自定义请求头。
          x-dynamic-request-header: "%START_TIME%" # 添加自定义请求头。
        set:
          x-another-request-header: "another-value" # 修改或设置请求头。
        remove:
        - x-unwanted-header # 移除请求头。
      response:
        add:
          x-custom-response-header: "custom-response-value" # 添加自定义响应头。
        set:
          x-another-response-header: "another-response-value" # 修改或设置响应头。
        remove:
        - x-unwanted-response-header # 移除响应头。
说明

虽然Virtual Service可以设置和修改HTTP头部信息,但这些更改对于Envoy Access Logs的默认配置可能不可见。如果您想在Envoy的Access Logs中记录这些自定义头部信息,需要修改Envoy的日志格式。

步骤二:通过日志查看自定义请求和响应内容

ASM提供自定义日志格式的功能,支持从请求Header、响应Header、Envoy内置值中取值。具体操作,请参见自定义日志格式

如下所示,新增3个字段用于在日志中显示内容,具体设置如下:

变量名称

类型

变量值

my-x-custom-request-header

请求属性

%REQ(x-custom-request-header)%

my-x-dynamic-request-header

请求属性

%REQ(x-dynamic-request-header)%

my-x-custom-response-header

响应属性

%RESP(x-custom-response-header)%

说明

在Virtual Service中,若响应头的配置修改在日志记录操作之后生效执行,则这些修改后的响应头信息将不会出现在Access Logs中。

  • 查看网关Pod的日志内容,可以看到类似如下内容:

    {
        "bytes_received": "9",
        "bytes_sent": "33",
        "response_code": "200",
        "my-x-custom-request-header": "custom-value",
        "my-x-dynamic-request-header":"2024-01-16T14:49:21.187Z"
        "my-x-custom-response-header": "custom-response-value"
    }
  • 查看httpbin Pod的日志内容,可以看到类似如下内容:

    {
        "bytes_received": "9",
        "bytes_sent": "33",
        "response_code": "200",
        "my-x-custom-request-header": "custom-value",
        "my-x-dynamic-request-header": "2024-01-16T14:49:21.187Z"
        "my-x-custom-response-header": "-"
    }