繁体   English   中英

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

[英]How to configure nginx.ingress.kubernetes.io/rewrite-target and spec.rules.http.paths.path to satisfy the following URI patterns

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

/aa/bb-aa/coolapp
/aa/bb-aa/coolapp/cc

传奇

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

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

/us/en-us/coolapp
/us/en-us/coolapp/faq
/us/en-us/coolapp/privacy-policy

注意

从版本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

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部分而不强制两个aa s相等,因为您可能 - 稍后 - 仍需要在您的服务中检查URI的正确性(例如/us/en-us可能被接受而/ab/cd-ab可能不被接受。

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

/[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/.*)?

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

/[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/[a-z0-9]+([a-z0-9]+)*)?

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


使用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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM