![](/img/trans.png)
[英]Kubernetes ingress rewrite-target and the rewrite regex/capture group (?i)
[英]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-target
和spec.rules.http.paths.path
以满足以下URI模式?
/aa/bb-aa/coolapp
/aa/bb-aa/coolapp/cc
传奇 :
示例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
。 这些占位符可用作重写目标注释中的参数。
参考文献 :
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.