如何为Ingress-Nginx的特定路径配置URL重写规则?
实现方案说明
Ingress-Nginx的所有注解默认作用于整个Ingress资源下的所有路径,无法直接针对单个Path单独设置注解。要实现仅指定路径重写,有两种常用方案:
方案一:拆分多个Ingress资源(官方推荐,易维护)
将需要重写的路径和不需要重写的路径拆分到不同的Ingress资源中,不同Ingress可以独立配置注解,不会互相影响。
- 不需要重写的根路径Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt nginx.ingress.kubernetes.io/force-ssl-redirect: "true" name: ingress-root spec: # 保留原有TLS配置即可 rules: - host: somehost.westeurope.cloudapp.azure.com http: paths: - path: / pathType: Prefix backend: service: name: client-svc port: number: 80
- 需要重写的路径Ingress配置(示例实现
/rest-smtp-sink/xxx重写为/xxx、/backend/xxx重写为/xxx):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 name: ingress-rewrite spec: # 保留原有TLS配置即可 rules: - host: somehost.westeurope.cloudapp.azure.com http: paths: - path: /rest-smtp-sink(/|$)(.*) pathType: Prefix backend: service: name: rest-smtp-sink-svc port: number: 80 - path: /backend(/|$)(.*) pathType: Prefix backend: service: name: server-svc port: number: 80
Ingress-Nginx会自动合并同一域名下的所有Ingress规则,路径匹配时优先匹配更长的前缀,不会出现规则冲突。
方案二:单Ingress使用自定义配置片段
如果不想拆分Ingress资源,可以通过nginx.ingress.kubernetes.io/configuration-snippet注解直接编写Nginx重写规则,仅匹配指定路径生效:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt nginx.ingress.kubernetes.io/force-ssl-redirect: "true" nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/rest-smtp-sink(/|$)(.*) /$2 break; rewrite ^/backend(/|$)(.*) /$2 break; name: ingress spec: rules: - host: somehost.westeurope.cloudapp.azure.com http: paths: - path: /rest-smtp-sink pathType: Prefix backend: service: name: rest-smtp-sink-svc port: number: 80 - path: /backend pathType: Prefix backend: service: name: server-svc port: number: 80 - path: / pathType: Prefix backend: service: name: client-svc port: number: 80
该方案需要熟悉Nginx语法,避免自定义规则和Ingress-Nginx默认生成的规则冲突,仅适合特殊场景使用。
内容的提问来源于stack exchange,提问作者Guerric P
相关产品推荐
相关产品推荐

