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

Nginx Ingress同主机下React应用/vendor路由访问异常求助

问题分析

当前问题的核心是Ingress路径匹配规则冲突:

  • 未启用正则匹配时,Prefix类型的根路径/?(.*)会匹配所有以/开头的请求(包括/vendor路径),导致/vendor的请求被错误转发到前端服务。
  • 前端服务返回的是HTML页面,而/vendor下的请求是React的JS模块资源,因此出现MIME类型不匹配的报错。
解决方案

1. 启用正则匹配并调整路径顺序

Nginx Ingress使用正则匹配时,会按配置的路径顺序优先匹配,因此需要把更具体的路径(/vendor、/backend)放在根路径规则之前,同时启用正则匹配开关。

2. 修正根路径正则表达式

使用负向预查正则,确保根路径只匹配不以/vendor或/backend开头的请求,避免覆盖子路径规则。

修改后的完整Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-staging
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/issuer: letsencrypt-staging-production
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
    kubernetes.io/ingress.allow-http: "true"
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($request_uri ~* "^/\?.*") {
        add_header Content-Type text/javascript;
      }
spec:
  tls:
  - hosts:
    - afriven.com
    secretName: ingress-staging-secret
  rules:
    - host: app.com
      http:
        paths:
          # 优先匹配/vendor路径,转发到vendor服务
          - path: /vendor/?(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: afriven-vendor-service-staging
                port:
                  number: 80

          # 优先匹配/backend路径,转发到后端服务
          - path: /backend/?(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: afriven-backend-service-staging
                port:
                  number: 5000

          # 匹配所有不以/vendor或/backend开头的请求,转发到前端服务
          - path: /((?!vendor|backend).*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: afriven-frontend-service-staging
                port:
                  number: 80

关键修改说明

  • 取消注释nginx.ingress.kubernetes.io/use-regex: "true",启用正则匹配逻辑。
  • 调整路径顺序:将/vendor、/backend路径放在根路径规则之前,确保这类请求优先被匹配。
  • 根路径使用/((?!vendor|backend).*)正则:通过负向预查排除/vendor和/backend开头的请求,避免干扰子路径转发。
  • 路径类型改为ImplementationSpecific:适配正则匹配场景,由Nginx Ingress控制器决定具体匹配逻辑。

验证方法

执行以下命令测试/vendor路径的转发结果,确认返回的是JS资源而非HTML:

curl -v app.com/vendor/main.js

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:55:34