我相信我必须创建多个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
(或其他位置)中指定重写目标->路径的映射,或者我必须将同一主机的不同重写规则分离为不同的
答案 0 :(得分:2)
您可以使用注释在同一主机和不同路径下创建多个入口。因此,这将是您最初怀疑的解决方案。
您可以考虑尝试Nginx Plus based Ingress。
要配置URI重写,您需要添加
nginx.org/rewrites
您的Ingress资源定义的注释。注释语法 如下:
nginx.org/rewrites: "serviceName=service1 rewrite=rewrite1[;serviceName=service2 rewrite=rewrite2;...]"
这是官方的example。
请告诉我是否有帮助。
答案 1 :(得分:1)
TL; DR;您并不是真的想为kubernetes / ingress-nginx控制器类型配置多个重写。尽管可以使用基于正则表达式的重写和捕获组以有限的方式将其合并,如我在How to proxy_pass with nginx-ingress? 中发布的答案中所述。
希望这会有所帮助。