如何配置 nginx.ingress.kubernetes.io/rewrite-target 和 spec.rules.http.paths.path 以满足以下 URI 模式
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
图例:
- a = a-z 之间的任意字母。小写。恰好 2 个字母 - 不多了,
不少于
- b = a-z 之间的任意字母。小写。恰好 2 个字母 - 不多不少。
- c = 任何有效的 URI 字符。小写。可变长度 - 想想 slug。
示例 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 中的任何子字符串都必须在捕获组中明确定义。
备注
捕获的组按时间顺序保存在编号占位符中,格式为 </code>、<code>
... $n
。这些占位符可以用作重写目标注释中的参数。
参考文献:
true
的 nginx.ingress.kubernetes.io/rewrite-target
annotation is used to indicate the target URI where the traffic must be redirected. As per how I understand your question, you only want to match the URI patterns that you specified without redirecting the traffic. In order to achieve this, you can set the nginx.ingress.kubernetes.io/use-regex
注释,从而在 spec.rules.http.paths.path
字段中启用正则表达式。
现在让我们看一下匹配 URI 模式所需的正则表达式。
首先,ingress-nginx doesn't support backreferences, therefore a regex like this one 使用的正则表达式引擎将无法工作。这不是问题,因为您可以在不强制两个 aa
相等的情况下匹配 /aa-bb/aa
部分,因为您以后 — 可能 — 仍然需要在您的服务中检查 URI 的正确性(例如 /us/en-us
可能会被接受,而 /ab/cd-ab
可能不会被接受)。
您可以使用 this regex 来匹配指定的 URI 模式:
/[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/.*)?
如果您只想匹配指定模式 cc
部分中的 URL slug,则可以改用此正则表达式:
/[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
您可以在 official user guide 中找到有关入口路径匹配的更多信息。
想出了以下配置 - 目前它适用于我所有的测试路线/要求。
正则表达式与@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: //-/
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
如何配置 nginx.ingress.kubernetes.io/rewrite-target
和 spec.rules.http.paths.path
以满足以下 URI 模式?
/aa/bb-aa/coolapp
/aa/bb-aa/coolapp/cc
图例:
- a = a-z 之间的任意字母。小写。恰好 2 个字母 - 不多了, 不少于
- b = a-z 之间的任意字母。小写。恰好 2 个字母 - 不多不少。
- c = 任何有效的 URI 字符。小写。可变长度 - 想想 slug。
示例 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 中的任何子字符串都必须在捕获组中明确定义。
备注
捕获的组按时间顺序保存在编号占位符中,格式为 </code>、<code>
... $n
。这些占位符可以用作重写目标注释中的参数。
参考文献:
true
的 nginx.ingress.kubernetes.io/rewrite-target
annotation is used to indicate the target URI where the traffic must be redirected. As per how I understand your question, you only want to match the URI patterns that you specified without redirecting the traffic. In order to achieve this, you can set the nginx.ingress.kubernetes.io/use-regex
注释,从而在 spec.rules.http.paths.path
字段中启用正则表达式。
现在让我们看一下匹配 URI 模式所需的正则表达式。
首先,ingress-nginx doesn't support backreferences, therefore a regex like this one 使用的正则表达式引擎将无法工作。这不是问题,因为您可以在不强制两个 aa
相等的情况下匹配 /aa-bb/aa
部分,因为您以后 — 可能 — 仍然需要在您的服务中检查 URI 的正确性(例如 /us/en-us
可能会被接受,而 /ab/cd-ab
可能不会被接受)。
您可以使用 this regex 来匹配指定的 URI 模式:
/[a-z]{2}/[a-z]{2}-[a-z]{2}/coolapp(/.*)?
如果您只想匹配指定模式 cc
部分中的 URL slug,则可以改用此正则表达式:
/[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
您可以在 official user guide 中找到有关入口路径匹配的更多信息。
想出了以下配置 - 目前它适用于我所有的测试路线/要求。
正则表达式与@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: //-/
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