You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ExpressJS路由解析失败:AKS集群微服务访问404求助

问题根源与解决方案

看起来你的问题出在Ingress的路径重写配置上,具体有两个关键错误导致Express收到的请求路径和你的路由不匹配:

1. 错误的Ingress注释键名

你当前使用的ingress.kubernetes.io/rewrite-target并不是nginx ingress controller识别的注释键——nginx ingress专门用nginx.ingress.kubernetes.io/rewrite-target来处理路径重写,所以你的重写规则根本没被生效,请求原封不动带着/payments/cards路径到达Express,而你的Express路由只注册了/cards,自然返回404。

2. 路径重写规则不完整

即使注释键正确,原来的path: /payments搭配rewrite-target: /也会丢失后续的路径部分(比如/cards),导致Express收到的是/而非/cards,同样匹配不到路由。

修正后的Ingress配置

把你的Ingress配置改成下面这样,就能正确把/payments/*的请求重写成/*转发到服务:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-service
  labels:
    app: test-service
    chart: test-service-0.1.0
    release: test-service
    heritage: Tiller
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2  # 修正注释键名,用捕获组传递后续路径
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
spec:
  tls:
  - hosts:
    - test.xyz
    secretName: default-tls
  rules:
  - host: test.xyz
    http:
      paths:
      - path: /payments(/|$)(.*)  # 用正则捕获/payments之后的所有路径
        backend:
          serviceName: test-service
          servicePort: 4040

额外验证步骤

  1. 确认服务本身正常:进入你的test-service Pod内部,执行curl localhost:4040/cards,如果能正常响应,说明Express路由本身没问题。
  2. 检查Service标签匹配:确保你的Service的selector(app: test-service, release: existing-bumblebee)和Pod的标签完全一致,否则流量无法转发到Pod。
  3. 确认Ingress Controller运行状态:用kubectl get pods -n ingress-nginx(如果是默认安装的命名空间)检查nginx ingress controller的Pod是否正常运行。

应用修改后的Ingress配置后,等待1-2分钟让配置生效,再访问https://test.xyz/payments/cards应该就能正常响应了。

内容的提问来源于stack exchange,提问作者MrFoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:21:39