ngnix - 如何使用 proxy_set_header 和 rewrite 进行条件判断

ngnix - 如何使用 proxy_set_header 和 rewrite 进行条件判断

以下是我的 ngnix 模板,它运行良好:

enterapiVersion: networking.k8s.io/v1   
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/proxy-body-size: "15m"
    nginx.ingress.kubernetes.io/configuration-snippet: |
        set $a $http_x_correlation_id;
        set $my_header $request_id;
        proxy_set_header X_Correlation_Id $my_header;   
        rewrite ^/app-name(/|$)(.*) /$2 break;
  name: rtfp-ingress-template
  namespace: rtfp
spec:
  ingressClassName: rtf-nginx
 rules:
  - host: ap.abc.com
    http:
      paths:
      - path: /app-name
        pathType: ImplementationSpecific
        backend:
          service:
            name: service
            port:
              number: 80

但是,当我引入 if 语句来选择性地添加标头时,即如果它不是来自客户端,则应该添加标头,它会失败并显示 404

nginx.ingress.kubernetes.io/configuration-snippet: |
        set $a $http_x_correlation_id;
        if ($a = ''){
            set $my_header $request_id;
            proxy_set_header X_Correlation_Id $my_header;           
        }        
        rewrite ^/app-name(/|$)(.*) /$2 break;

如果无法通过配置片段实现这一点,请告诉我通过 lua 脚本实现该目标的步骤是什么,以及 ngnix kubernetes 环境中有关 lua 脚本的任何好的教程。

答案1

您可以使用地图模块实现条件行为。

以下是如何有条件地设置 X_Correlation_Id 标头的示例:

nginx.ingress.kubernetes.io/configuration-snippet: |
    set $a $http_x_correlation_id;
    set $my_header $request_id;
    if ($a = '') {
        set $my_header "default_value";  # Set a default value when $a is empty
    }
    proxy_set_header X_Correlation_Id $my_header;
    rewrite ^/app-name(/|$)(.*) /$2 break;

请记住,在 Nginx 中使用 if 语句可能会出现问题,因此最好尽可能使用 map 模块或其他配置选项

相关内容