我相信我必须创建多个Ingress
资源才能达到预期的效果,但必须问,是否可以使用nginx(社区(控制器为同一主机进行多次重写注释?
我有以下内容,但据我了解,它不起作用,因为无法将重写规则显式链接到路径。在这种情况下,我想它可以使用存在不同数量的捕获组的事实,但情况并非总是如此。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: api-ingress
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: https://staging.example.com/keyword-lnk/badnewsbears/$1/$2
nginx.ingress.kubernetes.io/rewrite-target: https://staging.example.com/lnk/$2
certmanager.k8s.io/cluster-issuer: staging-letsencrypt-prod
spec:
rules:
- host: staging.example.com
http:
paths:
- path: /
backend:
serviceName: api-service
servicePort: http
- host: badnewsbears.example.com
http:
paths:
- backend:
serviceName: api-service
servicePort: http
path: ^(/a/)(.*)$
- backend:
serviceName: api-service
servicePort: http
path: ^/([tbc])/(.*)
tls:
- hosts:
- staging.example.com
- badnewsbears.example.com
secretName: letsencrypt-prod-issuer-account-key
# ^ must be set to the key matching the annotation
# certmanager.k8s.io/cluster-issuer above
目标是让请求staging.example.com
没有重写,而是请求badnewsbears.example.com/t/soup
重写到https://staging.example.com/keyword-lnk/badnewsbears/t/soup
,而badnewsbears.example.com/a/soup
产生https://staging.example.com/lnk/$2
有没有办法在Ingress
(或其他地方(指定重写目标>路径的映射,或者我是否必须将同一主机的不同重写规则分离到不同的
TL;博士;你并不是真的能够为 Kubernetes/Ingress-nginx 控制器类型配置多个重写。尽管可以使用捕获组使用基于正则表达式的重写以有限的方式将其破解在一起,但正如我发布到如何使用nginx-ingress proxy_pass的答案中所解释的那样? .
希望这有帮助。
-
您可以创建多个入口,使用相同的主机和应用注释的不同路径。所以这将是你首先怀疑的解决方案。
-
您可以考虑尝试基于Nginx Plus的Ingress。
要配置 URI 重写,您需要添加
nginx.org/rewrites
对入口资源定义的注释。批注语法 具体如下:
nginx.org/rewrites: "serviceName=service1 rewrite=rewrite1[;serviceName=service2 rewrite=rewrite2;...]"
这是官方示例。
如果有帮助,请告诉我。