alibaba / tengine

A distribution of Nginx with some advanced features
https://tengine.taobao.org
BSD 2-Clause "Simplified" License
12.81k stars 2.52k forks source link

Supports appending HTTP headers of the user request to upstream based on routing of header, cookie or query #1844

Closed lianglli closed 11 months ago

lianglli commented 1 year ago

基于Header/Cookie/Query的路由匹配,向后端upstream转发时在请求中追加指定的Header。

在请求消息的header中追加header值

如果存在相同的header名,在已有的header值后增加'&'分割符,再追加header值

如果请求消息的header不存在,则直接增加

值格式:"header name:header value[||header name:header value]*"

值校验:header以'||'分割,header名和header值以':'分割,header name和header value不允许包含':'和'||',默认最多允许追加2个header

无损动态生效,无需tengine reload。

lianglli commented 11 months ago
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-query: open3
    nginx.ingress.kubernetes.io/canary-by-query-value: abc1||abc2||abc3||abc4||abc5||abc6||abc7||abc8||abc9||abc10||abc11||abc12||abc13||abc14||abc15||abc16||abc17||abc18||abc19||abc20||abc21
    nginx.ingress.kubernetes.io/canary-request-append-header: UserData:user=236-564-29121||test-ingress6:$ssl_protocol
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
  creationTimestamp: "2023-10-31T06:30:31Z"
  generation: 2
  name: tengine-ingress-hello-query-ing
  namespace: default
  resourceVersion: "28580135"
  uid: debebfd0-afd2-4604-af8d-a41ad400bfbc
spec:
  ingressClassName: opensource-ingress
  rules:
  - host: echo.w1.com
    http:
      paths:
      - backend:
          service:
            name: tengine-ingress-hello3-service
            port:
              number: 80
        path: /
        pathType: Prefix
  tls:
  - hosts:
    - echo.w1.com
    secretName: https-server-1
status:
  loadBalancer:
    ingress:
    - {}
$ curl -i -k -H "test-ingress6: default" https://echo.w1.com/?open3=abc2
HTTP/2 301 
server: Tengine/3.1.0
date: Wed, 01 Nov 2023 11:33:42 GMT
location: /?open3=abc2/
strict-transport-security: max-age=0
ups-target-key: default-tengine-ingress-hello3-service-80
x-protocol: HTTP/2.0
alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000

image