EKS ALB Ingress Controller静态资源路径路由404问题
问题根因
- 前端路由的
pathType: Exact配置不符合业务需求:Exact模式仅会匹配路径**完全等同于/**的请求,所有根路径下的子路径(如/main.css、/main-5a17625f9c68d9c60c4c.js)都不会命中该规则,ALB无匹配转发规则时会直接返回404。 - 路径顺序违反ALB Ingress的匹配逻辑:AWS Load Balancer Controller不会像原生Kubernetes Ingress那样自动按「最长路径优先」排序规则,生成的ALB监听器规则会严格按照
paths字段的书写顺序从上到下匹配,命中第一条规则就直接转发,不会继续向后匹配。之前把前端/的Prefix规则放在/marketing/规则之前时,所有请求都会先命中根路径规则转发到前端,后端路由自然完全失效。 - 带双斜杠的路径返回404本质也是未命中前端路由导致的,匹配逻辑修复后这类请求会正常转发到前端,如果业务需要自动规整连续斜杠,可以额外配置ALB重写规则做优化。
调整方法
核心做两处修改即可:
- 调换
paths列表的规则顺序,把路径更长、匹配范围更精确的/marketing/后端规则放在最前面,保证该路径下的请求优先匹配到后端服务 - 将前端路由的
pathType改为Prefix,保留path: /配置,放在规则列表最后,用来匹配所有未命中后端规则的请求(包括根路径、静态资源等) - 可选配置:如果后端服务本身不识别
/marketing前缀,即公网访问/marketing/api时,后端实际需要接收的路径为/api,可以添加alb.ingress.kubernetes.io/rewrite-target: /注解,转发前自动剥离路径中的/marketing前缀。
调整后的完整Ingress配置如下:
--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: instance kubernetes.io/ingress.class: alb # 后端不需要/marketing前缀时再打开下面注解 # alb.ingress.kubernetes.io/rewrite-target: / name: my-site namespace: my-site spec: rules: - host: my-site.com http: paths: # 长路径规则必须靠前放置 - backend: service: name: my-site-backend-service port: number: 3000 path: /marketing/ pathType: Prefix # 根路径兜底规则放在最后 - backend: service: name: my-site-front-end-service port: number: 80 path: / pathType: Prefix
配置生效后可以在EC2控制台的ALB监听器页确认规则顺序:优先级最高的规则匹配/marketing/*转发后端,最低优先级的兜底规则匹配/*转发前端,此时:
- 访问根路径、根路径下的所有静态资源都会正常转发到前端服务,不再返回404
- 访问
/marketing/开头的路径会优先转发到后端服务,不会被前端规则拦截
内容的提问来源于stack exchange,提问作者raghunath
相关产品推荐
相关产品推荐

