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

K8s部署应用访问REST端点返回404错误问题排查

Kubernetes Nginx Ingress 场景下POST接口返回404排查方案

核心排查原则

你反复调整后端Ingress路径规则始终无效,首先要跳出「路径匹配错误」的思维定式:GraphQL接口正常访问已经证明/前缀的转发规则是生效的,不需要再反复修改path配置。先定位404的返回来源,再针对性修复。

第一步:定位404响应的来源

打开浏览器开发者工具,找到报错的POST请求,查看响应头的Server字段:

  • 如果值为nginx,说明请求在Ingress层被拦截,未转发到后端服务
  • 如果值为quarkus/vert.x,说明请求已经到达后端,是后端服务自身返回的404

同时检查报错请求的完整URL,确认域名是后端服务的backend.exemple.com还是前端服务的bilels.exemple.com,80%的前后端分离部署404问题都是接口路径写错导致的。

场景1:请求发到了前端域名,被前端静态服务返回404

问题特征

报错POST请求的域名是bilels.exemple.com,GraphQL接口正常是因为代码里写死了后端域名,获取token的REST接口用了相对路径,请求被转发到Angular前端服务。Angular是单页静态应用,只处理静态资源和前端路由,对于POST类接口请求会直接返回404。

修复方案

二选一即可:

  • 前端代码修复:统一所有后端接口的请求baseUrl为https://backend.exemple.com,确保所有接口请求直接发往后端域名,不经过前端Ingress。
  • 前端Ingress路由分流:修改前端Ingress配置,将后端接口路径的请求转发到后端服务,静态资源请求转发到前端服务,注意长路径规则必须放在/规则前面,避免被前缀匹配优先拦截,配置参考:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: mcs-thirdparty-ingress
  namespace: namespace
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  ingressClassName: nginx-internal
  rules:
  - host: bilels.exemple.com
    http:
      paths:
      # 替换成你实际的后端接口前缀,比如/auth、/api等
      - path: /(graphql|auth|api)(.*)
        backend:
          service:
            name: mcs-thirdparty-backend
            port:
              number: 8080
        pathType: Prefix
      - path: /
        backend:
          service:
            name: mcs-thirdparty-frontend
            port:
              number: 80
        pathType: Prefix

场景2:请求到达后端Quarkus服务,后端返回404

先在集群内跳过Ingress直接测试后端接口,排除Ingress影响:

# 临时启动curl测试Pod
kubectl run curltest --image=curlimages/curl -it --rm -- sh
# 在Pod内直接访问后端Service,替换为实际的token接口路径
curl -X POST http://mcs-thirdparty-backend:8080/你的token接口路径 -v

如果上述命令返回404,直接排查后端配置,常见原因:

  • HTTP方法不匹配:检查接口注解配置,部分Quarkus RESTEasy版本对仅允许GET的接口,收到POST请求时会返回404而非标准的405状态码。可以同时用GET方法请求同一路径验证,如果GET正常POST 404,直接给接口加上@POST注解即可。
  • 上下文根配置不一致:检查Quarkus配置文件application.properties,如果配置了quarkus.http.root-path或quarkus.resteasy-reactive.path,所有REST接口会增加统一前缀,而GraphQL如果单独配置了路径则不受影响,导致你请求的路径和后端实际暴露的路径不匹配。
  • CORS配置拦截:部分Quarkus版本对跨域配置不合法的请求会直接返回404,而非标准的CORS跨域错误。确保配置中允许前端域名跨域,参考配置:
quarkus.http.cors.origins=https://bilels.exemple.com
quarkus.http.cors.methods=GET,POST,PUT,DELETE,OPTIONS
quarkus.http.cors.headers=accept,authorization,content-type,x-requested-with

之前调整path配置无效的原因

你之前尝试的/(.*)、/*、/response等path配置,要么没有配合nginx.ingress.kubernetes.io/rewrite-target注解做路径重写,导致转发到后端的路径和接口实际路径不匹配;要么本身/前缀规则已经可以覆盖所有请求,修改path完全没有必要。


内容的提问来源于stack exchange,提问作者Bilel-NEJI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:57:30