參考:https://kubernetes.github.io/ingress-nginx/user-guide/ingress-path-matching/
正則表達式支持
示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/.*
backend:
serviceName: test
servicePort: 80
上面的Ingress定義將轉換為 NGINX 配置中的以下位置塊,用於 test.com服務器:
location ~* "^/foo/.*" {
...
}
路徑優先級
在 NGINX 中,正則表達式遵循 首次匹配 策略。 為了實現更准確的路徑匹配,ingress-nginx 首先按長度降序對路徑進行排序,然后將它們作為位置塊寫入 NGINX 模板。
示例
創建以下兩個Ingress定義:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-1
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/bar
backend:
serviceName: service1
servicePort: 80
- path: /foo/bar/
backend:
serviceName: service2
servicePort: 80
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-2
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/bar/(.+)
backend:
serviceName: service3
servicePort: 80
Ingress控制器將在 NGINX 模板中按長度降序定義以下位置塊 test.com服務器:
location ~* ^/foo/bar/.+ {
...
}
location ~* "^/foo/bar/" {
...
}
location ~* "^/foo/bar" {
...
}
以下請求 URI 將匹配相應的位置塊:
- test.com/foo/bar/1 matches ~* ^/foo/bar/.+ and will go to service 3.
- test.com/foo/bar/ matches ~* ^/foo/bar/ and will go to service 2.
- test.com/foo/bar matches ~* ^/foo/bar and will go to service 1.
重要說明:如果 use-regex要么 rewrite-target注釋用於給定主機的任何Ingress,然后不區分大小寫的正則表達式 位置修飾符 將在給定主機的所有路徑上強制執行,無論它們定義在哪個Ingress上。
警告
以下示例描述了一種可能導致不需要的路徑匹配行為的情況。
這種情況是預料之中的,並且是 NGINX 對使用正則表達式 路徑的第一個匹配策略的結果 位置修飾符(https://nginx.org/en/docs/http/ngx_http_core_module.html#location) 。 有關如何選擇路徑的更多信息,請閱讀以下文章: “了解 Nginx 服務器和位置塊選擇算法(https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms)” 。
示例
定義以下Ingress:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-ingress-3
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: test.com
http:
paths:
- path: /foo/bar/bar
backend:
serviceName: test
servicePort: 80
- path: /foo/bar/[A-Z0-9]{3}
backend:
serviceName: test
servicePort: 80
Ingress控制器將在 NGINX 模板中定義以下位置塊(按此順序) test.com服務器:
location ~* "^/foo/bar/[A-Z0-9]{3}" {
...
}
location ~* "^/foo/bar/bar" {
...
}
一個請求 test.com/foo/bar/bar將匹配 ^/foo/bar/[A-Z0-9]{3}位置塊而不是最長的精確匹配路徑。