AKS集群Nginx Ingress重写目标问题:无尾斜杠静态资源加载失败
问题分析
- 相对路径解析偏差:访问
20.200.200.200/articles(无尾斜杠)时,浏览器会将页面内的./assets/xxx相对路径解析为/articles/assets/xxx;虽路径格式看似与/articles/(带尾斜杠)场景一致,但结合Ingress重写规则后,资源请求被错误转发。 - Ingress路径类型配置冲突:使用正则路径时,
pathType: Prefix会导致Nginx Ingress Controller的匹配逻辑异常,需改用ImplementationSpecific适配正则匹配。 - 资源转发目标错误:
/articles/assets/xxx被重写为/assets/xxx后,会被/(.*)规则捕获并转发到landing-page服务,返回HTML页面而非静态资源,引发语法错误。
解决方法
方法一:修复Ingress配置(推荐)
调整Ingress路径类型,添加自动重定向规则确保无尾斜杠请求跳转至带尾斜杠路径,同时新增静态资源专属转发规则,保证请求正确路由到articles服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: personal annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 # 自动将无尾斜杠的/articles重定向到/articles/ nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/articles$ /articles/ permanent; spec: ingressClassName: nginx rules: - http: paths: # 修改pathType适配正则匹配 - path: /articles(/|$)(.*) pathType: ImplementationSpecific backend: service: name: articles port: number: 80 # 新增静态资源转发规则,优先级高于landing-page - path: /assets(/|$)(.*) pathType: ImplementationSpecific backend: service: name: articles port: number: 80 - path: /(.*) pathType: ImplementationSpecific backend: service: name: landing-page port: number: 80
方法二:修改页面静态资源路径为绝对路径
将HTML中的相对路径改为以/开头的绝对路径,确保无论访问路径是否带尾斜杠,静态资源请求都指向正确路径:
修改index.html中的资源引用:
<link rel="stylesheet" href="/assets/css/main.css" /> <script src="/assets/js/jquery.min.js"></script> <script src="/assets/js/browser.min.js"></script> <script src="/assets/js/breakpoints.min.js"></script> <script src="/assets/js/util.js"></script> <script src="/assets/js/main.js"></script>
同时需在Ingress中添加方法一中的/assets(/|$)(.*)路径规则,保证/assets/xxx请求转发到articles服务。
方法三:调整Nginx容器配置(需修改镜像)
修改articles服务的Nginx配置文件default.conf,在容器内部处理无尾斜杠请求的重定向:
server { listen 80; server_name _; root /usr/share/nginx/html; index index.html; # 将根路径无尾斜杠请求重定向到带尾斜杠 location = / { rewrite ^/$ / permanent; } location / { try_files $uri $uri/ =404; } }
重新构建镜像并部署后,配合现有Ingress配置即可解决问题。
内容的提问来源于stack exchange,提问作者Victor BONNET
相关产品推荐
相关产品推荐

