首页 > 解决方案 > 路径中具有命名捕获组的 Ingress-Nginx 正则表达式路由规则

问题描述

我正在为 nginx 入口控制器创建 Kubernetes 入口资源。我将使用的路径有一个 ID,我需要将其提取到一个变量中,该变量可能位于路径中的不同位置。例如:

http://myservice/environment/<someenv>/room/<roomid>
http://myservice/join/<roomid>

如果我在正则表达式中使用未命名的捕获组,那么第一个路径roomid将是$2,第二个路径将是$1. 理想情况下,我可以使用命名捕获组将其分配给我可以轻松使用的特定变量,但是使用命名捕获组创建具有以下路径的 Ingress 会导致错误

# ingresses.networking.k8s.io "nginx-consistent" was not valid:
# * spec.rules[0].http.paths[0].path: Invalid value: "/join/(?<roomid>.*)": must be a valid regex

是否有支持使用命名捕获组的方法?

当前的配置并没有太多有趣的地方。以下是精简的配置。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: {{.Release.Name}}-nginx-route-by-roomid
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/upstream-hash-by: "roomid-$roomid"
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header ingress-handler nginx-route-by-roomid;
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: {{ .Values.service.serviceName }}
              servicePort: {{ .Values.service.servicePort }}
            path: /api/v1/rooms/(?<roomid>[^/]*)
          - backend:
              serviceName: {{ .Values.service.serviceName }}
              servicePort: {{ .Values.service.servicePort }}
            path: /api/v1/players/([^/]*)/rooms/(?<roomid>[^/]*)

标签: kubernetes-ingressingress-nginx

解决方案


推荐阅读