如何配置nginx.ingress.kubernetes.io/rewrite-target和spec.rules.http.paths.path以满足以下URI模式

Pus*_*ots 5 regex nginx kubernetes kubernetes-ingress nginx-ingress

如何配置nginx.ingress.kubernetes.io/rewrite-targetspec.rules.http.paths.path满足以下URI模式?

/aa/bb-aa/coolapp
/aa/bb-aa/coolapp/cc
Run Code Online (Sandbox Code Playgroud)

图例

  • a = az之间的任何字母。小写。恰好2个字母-不多也不少。
  • b = az之间的任何字母。小写。恰好2个字母-不多也不少。
  • c =任何有效的URI字符。小写。长度可变-认为。

示例URI:应该与上述模式匹配

/us/en-us/coolapp
/us/en-us/coolapp/faq
/us/en-us/coolapp/privacy-policy
Run Code Online (Sandbox Code Playgroud)

注意

从0.22.0版开始,使用注释的入口定义nginx.ingress.kubernetes.io/rewrite-target与以前的版本不向后兼容。在0.22.0版及更高版本中,必须在捕获组中显式定义请求URI中需要传递到重写路径的任何子字符串。

注意

捕获组都储存在编号占位符,按时间顺序,形式$1$2... $n。这些占位符可用作重写目标注释中的参数。

参考文献

  1. https://kubernetes.github.io/ingress-nginx/examples/rewrite/
  2. https://github.com/kubernetes/ingress-nginx/pull/3174

Gil*_*mes 5

nginx.ingress.kubernetes.io/rewrite-target注释用于指示目标URI在交通必须重定向。根据我对您的问题的理解,您只想匹配您指定的 URI 模式而不重定向流量。为了实现这一点,您可以将nginx.ingress.kubernetes.io/use-regex注释设置为true,从而在spec.rules.http.paths.path字段中启用正则表达式。

现在让我们看一下匹配 URI 模式所需的正则表达式。首先,ingress-nginx 使用的正则表达式引擎不支持反向引用,因此像这样的正则表达式将不起作用。这不是问题,因为您可以在/aa-bb/aa不强制两个aas 相等的情况下匹配该部分,因为您将(大概)稍后在您的服务中检查 URI 的正确性(例如,/us/en-us可能会被接受,但/ab/cd-ab可能不会)。

您可以使用此正则表达式来匹配指定的 URI 模式:

/[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/.*)?
Run Code Online (Sandbox Code Playgroud)

如果您只想匹配cc您指定的模式部分中的URL slug,则可以使用此正则表达式:

/[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/[a-z0-9]+([a-z0-9]+)*)?
Run Code Online (Sandbox Code Playgroud)

最后,由于nginx.ingress.kubernetes.io/use-regex强制不区分大小写的正则表达式,使用[A-Z]而不是[a-z]会导致相同的结果。


遵循使用use-regex注释的入口示例定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-regex
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - host: test.com
    http:
      paths:
      - path: /[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/.*)?
        backend:
          serviceName: test
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)

您可以在官方用户指南中找到有关 Ingress Path Matching 的更多信息。


Pus*_*ots 3

提出了以下配置 - 到目前为止它适用于我的所有测试路线/要求。

该正则表达式与@Gilgames 发布的几乎相同。

我基于官方文档重写示例:https ://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-target

除此之外,我在https://www.regular-expressions.info/上学习了快速课程

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ing
  namespace: some-ns
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1/$2-$3/$5
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "INGRESSCOOKIE"
    nginx.ingress.kubernetes.io/session-cookie-path: /
    nginx.ingress.kubernetes.io/from-to-www-redirect: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
        if ($host = 'example.com')
        {
            rewrite ^ https://www.example.com$request_uri permanent;
        }
spec:
  tls:
  - hosts:
    - www.example.com
    - example.com
    secretName: tls-secret-test
  rules:
  - host: www.example.com
    http:
      paths:
      - path: /([a-z]{2})/([a-z]{2})-([a-z]{2})/coolapp(/|$)(.*)
        backend:
          serviceName: coolapp-svc
          servicePort: 80
  - host: example.com
    http:
      paths:
      - path: /([a-z]{2})/([a-z]{2})-([a-z]{2})/coolapp(/|$)(.*)
        backend:
          serviceName: coolapp-svc
          servicePort: 80
Run Code Online (Sandbox Code Playgroud)