如何在Kubernetes中为单个主机重写特定Assets路径
解决Nginx Ingress路径重写问题
你的需求是仅将test.example.com/assets/*重写为/public/assets/*,其他路径保持不变,当前配置的问题主要出在全局重写注解滥用和正则分组不匹配上,以下是修正后的配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-body-size: 100m nginx.ingress.kubernetes.io/use-regex: "true" # 移除全局rewrite-target,避免影响所有路径 spec: rules: - host: www.example.com http: paths: - path: / pathType: ImplementationSpecific backend: service: name: example port: name: http - path: /.* pathType: ImplementationSpecific backend: service: name: example port: name: http - host: test.example.com http: paths: # 优先匹配/assets路径,单独设置重写规则 - path: /assets/(.*) pathType: ImplementationSpecific backend: service: name: example-test port: name: http # 仅对该路径应用重写,将/assets/xxx转为/public/assets/xxx annotations: nginx.ingress.kubernetes.io/rewrite-target: /public/assets/$1 # 其他路径不做重写,直接转发 - path: / pathType: ImplementationSpecific backend: service: name: example-test port: name: http - path: /.* pathType: ImplementationSpecific backend: service: name: example-test port: name: http
关键修正点说明:
- 移除全局rewrite-target注解:原配置的全局重写会导致所有域名的请求都被修改,完全不符合仅针对特定路径重写的需求。
- 给/assets路径单独添加重写注解:通过在paths层级单独配置rewrite-target,确保重写规则仅作用于
/assets/*路径,不影响其他请求。 - 修正正则分组逻辑:路径
/assets/(.*)将/assets/后的内容捕获为$1,重写时替换为/public/assets/$1,保证路径映射准确。 - 调整规则匹配顺序:将
/assets的规则放在最前面,因为Nginx Ingress会按从上到下的顺序匹配路径,优先处理特定规则能避免被通用规则提前拦截。
内容的提问来源于stack exchange,提问作者neu242
相关产品推荐
相关产品推荐

