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
相关产品推荐
相关产品推荐

