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

后端 未结 2 2005
礼貌的吻别
礼貌的吻别 2021-02-10 09:43

How can I configure nginx.ingress.kubernetes.io/rewrite-target and spec.rules.http.paths.path to satisfy the following URI patterns?

/a         


        
相关标签:
2条回答
  • 2021-02-10 10:24

    The nginx.ingress.kubernetes.io/rewrite-target annotation is used to indicate the target URI where the traffic must be redirected. As per how I understand your question, you only want to match the URI patterns that you specified without redirecting the traffic. In order to achieve this, you can set the nginx.ingress.kubernetes.io/use-regex annotation to true, thus enabling regular expressions in the spec.rules.http.paths.path field.

    Let's now take a look at the regex that you will need to match your URI patterns. First of all, the regex engine used by ingress-nginx doesn't support backreferences, therefore a regex like this one will not work. This is not a problem as you can match the /aa-bb/aa part without forcing the two aas to be equal since you will —presumably— still have to check the correctness of the URI later on in your service (e.g /us/en-us may be accepted whereas /ab/cd-ab may not).

    You can use this regex to match the specified URI patterns:

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

    If you want to only match URL slugs in the cc part of the pattern you specified, you can use this regex instead:

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

    Lastly, as the nginx.ingress.kubernetes.io/use-regex enforces case insensitive regex, using [A-Z] instead of [a-z] would lead to the same result.


    Follows an ingress example definition using the use-regex annotation:

    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
    

    You can find more information about Ingress Path Matching in the official user guide.

    0 讨论(0)
  • 2021-02-10 10:27

    Came up with the following configuration - it is working for all of my test routes / requirements so far.

    The regex is almost the same as the one posted by @Gilgames.

    I based mine on the official docs rewrite example: https://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-target

    Apart from that I took a quick course at https://www.regular-expressions.info/

    0 讨论(0)
提交回复
热议问题