我使用的是Nginx侵入控制器舵图0.6.0和nginx入口控制器标签1.8.0,kubernetes 1.15。
当我在我的宏中定义一个使用regex的路径时,它不能工作,因为它没有在Nginx控制器的配置文件位置部分被指定为regex。
我需要使用一个版本的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/(.*) {我希望看到位置~* /quack5 5/(.*){
发布于 2020-08-18 09:20:24
尝试将nginx.ingress.kubernetes.io/rewrite-target注释添加到您的定义文件中。
删除nginx.ingress.kubernetes.io/use-regex: "true"注释。
编辑:
我认为问题可能在buildLocation函数(&& location.Rewrite.Target != path)中。如果路径和nginx.ingress.kubernetes.io/rewrite-target相等,则nginx位置不以~*作为前缀,而是作为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位置结束,而不管nginx.ingress.kubernetes.io/rewrite-target可能是什么(即使它没有指定)。目前,将位置作为regex (添加~*)进行威胁的唯一方法是定义一个与nginx.ingress.kubernetes.io/rewrite-target不同的spec.rules.http.paths.path。
请看一看:入口处,入口路径匹配,路径不三位一体的正则表达式。
https://stackoverflow.com/questions/63454599
复制相似问题