我使用的是Nginx入口控制器helm chart 0.6.0和Nginx入口控制器标签1.8.0,kubernetes 1.15。
当我在Ingress中定义一个使用正则表达式的路径时,它不起作用,因为它没有在Nginx控制器的配置文件位置部分指定为正则表达式。
我需要使用一个版本的nginx入口控制器,它还支持VirtualServer和VirtualServerRoutes。
kind: Ingress
metadata:
name: test-ingress
namespace: ingress-test
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
rules:
- host: test.any-xyz.com
http:
paths:
- path: /quack5/(.*)
backend:
serviceName: test
servicePort: 80
当我应用这个时,nginx入口控制器已经将位置设置为非正则表达式
$ kubectl -n nginx-ingress-controller exec nginx-ingress-controller-nginx-ingress-79984b9747-8pl4w -- grep -R quack /etc/nginx/conf.d
$ /etc/nginx/conf.d/ingress-test-test-ingress.conf: location /quack5/(.*) {
我希望看到位置~*/嘎嘎5/(.*({
尝试将nginx.ingress.kubernetes.io/rewrite-target
注释添加到Nginx Ingress Controller定义文件中。
删除nginx.ingress.kubernetes.io/use-regex: "true"
注释。
编辑:
我认为问题可能出在buildLocation函数中(&&location.Rewrite.Target!=路径(。如果路径和nginx.ingress.kubernetes.io/rewrite-target
相等,则nginx Location不以~*为前缀,并作为regex处理。
if len(location.Rewrite.Target) > 0 && location.Rewrite.Target != path {
if path == slash {
return fmt.Sprintf("~* %s", path)
}
// baseuri regex will parse basename from the given location
baseuri := `(?<baseuri>.*)`
if !strings.HasSuffix(path, slash) {
// Not treat the slash after "location path" as a part of baseuri
baseuri = fmt.Sprintf(`/?%s`, baseuri)
}
return fmt.Sprintf(`~* ^%s%s`, path, baseuri)
}
return path
我建议使用一个指令来指定spec.rules.http.paths.path最终应为regex Location,而不管nginx.ingress.kubernetes.io/rewrite-target
可能是什么(即使没有指定(。目前,将要受到威胁的位置作为regex(已添加~*(的唯一方法是定义一个不同于spec.rules.http.paths.path.的nginx.ingress.kubernetes.io/rewrite-target
请看一看:入口正则表达式,入口路径匹配,路径未威胁为正则表达式。