如何配置 nginx.ingress.kubernetes.io/rewrite-target 和 spec.rules



如何配置nginx.ingress.kubernetes.io/rewrite-targetspec.rules.http.paths.path以满足以下 URI 模式?

/aa/bb-aa/coolapp
/aa/bb-aa/coolapp/cc

图例

a
  • =a-z之间的任何字母。小写。正好 2 个字母 - 没有更多, 不少。
  • b= a-z 之间的任何字母。小写。正好 2 个字母 - 不多也不少。
  • c= 任何有效的 URI 字符。小写。长度可变 - 想想蛞蝓。

应与上述模式匹配的示例 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.这些占位符可用作重写目标批注中的参数。

参考资料

  1. https://kubernetes.github.io/ingress-nginx/examples/rewrite/
  2. https://github.com/kubernetes/ingress-nginx/pull/3174

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相等,因为您可能仍然必须在稍后的服务中检查 URI 的正确性(例如,/us/en-us可能会被接受,而/ab/cd-ab可能不会)。

您可以使用此正则表达式来匹配指定的 URI 模式:

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

如果只想匹配指定模式cc部分中的 URL 数据域,则可以改用此正则表达式:

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

最后,由于nginx.ingress.kubernetes.io/use-regex强制执行不区分大小写的正则表达式,因此使用[A-Z]而不是[a-z]会导致相同的结果。


遵循使用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

您可以在官方用户指南中找到有关入口路径匹配的更多信息。

提出了以下配置 - 到目前为止,它适用于我的所有测试路线/要求。

正则表达式几乎与@Gilgames发布的正则表达式相同。

我基于官方文档重写示例:https://kubernetes.github.io/ingress-nginx/examples/rewrite/#rewrite-target

除此之外,我还参加了 https://www.regular-expressions.info/快速课程

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

相关内容

  • 没有找到相关文章

最新更新