K8s Nginx Ingress部署NextJS报Unexpected token '<'错误
问题原因
Uncaught SyntaxError: Unexpected token '<' 错误的本质是:浏览器请求NextJS加载所需的JS静态资源时,没有收到预期的JS脚本内容,反而收到了HTML格式的index.html页面(HTML内容以<开头),JS引擎解析时碰到非法的<字符直接抛出语法错误。
问题根源在Ingress的全局注解配置:
你在Ingress元数据里全局配置了nginx.ingress.kubernetes.io/rewrite-target: /$2,这个重写规则对两个API路径是有效的,可以把/api/auth/xxx这类带前缀的请求重写为/xxx转给后端微服务。但这个全局规则对前端NextJS的路由完全不适用:
- 前端路由规则
/?(.*)只配置了1个捕获组,$2取值为空 - 所有发往NextJS的请求(包括
/_next/static/路径下的JS、CSS静态资源)都会被全局重写为根路径/ - NextJS收到静态资源路径的请求,发现重写后的路径是
/,找不到对应资源,就默认返回首页的index.html内容,最终导致浏览器解析失败。
修复方法
移除全局的rewrite-target注解,只给两个需要路径裁剪的API接口单独配置重写规则,前端NextJS的路径保持原路径转发,不要做任何重写。
修正后的ingress.yaml配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-service annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/enable-cors: "true" spec: rules: - host: ticket.com http: paths: - path: /api/auth(/|$)(.*) pathType: Prefix backend: service: name: auth-srv port: number: 3001 metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 - path: /api/tickets(/|$)(.*) pathType: Prefix backend: service: name: tickets-srv port: number: 3002 metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 - path: /?(.*) pathType: Prefix backend: service: name: client-srv port: number: 3000
验证操作
- 执行
kubectl apply -f ingress.yaml应用新配置 - 等待10-20秒待Ingress规则同步完成,清空浏览器缓存后强制刷新页面
- 可单独访问NextJS静态资源路径(如
http://ticket.com/_next/static/chunks/webpack.js)校验,若返回JS代码而非<!DOCTYPE html>开头的HTML内容,即修复完成。
内容的提问来源于stack exchange,提问作者Rhythm Shandlya
相关产品推荐
相关产品推荐

