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
额外验证步骤
- 确认服务本身正常:进入你的
test-servicePod内部,执行curl localhost:4040/cards,如果能正常响应,说明Express路由本身没问题。 - 检查Service标签匹配:确保你的Service的
selector(app: test-service, release: existing-bumblebee)和Pod的标签完全一致,否则流量无法转发到Pod。 - 确认Ingress Controller运行状态:用
kubectl get pods -n ingress-nginx(如果是默认安装的命名空间)检查nginx ingress controller的Pod是否正常运行。
应用修改后的Ingress配置后,等待1-2分钟让配置生效,再访问https://test.xyz/payments/cards应该就能正常响应了。
内容的提问来源于stack exchange,提问作者MrFoh
相关产品推荐
相关产品推荐

