Kubernetes使用Ingress部署ASP.NET Core应用时CSS、JS资源404问题
问题根因
你的静态资源加载404的核心原因是ASP.NET Core应用输出的静态资源引用使用了站点根路径的绝对地址,与Ingress配置的路径前缀不匹配:
- 你通过Ingress访问web1的地址是
http://tasty.taco.com/web1,Ingress将路径重写为/转发给web1服务,应用返回的HTML里静态资源路径是/lib/bootstrap/xxx.css这种根路径格式 - 浏览器解析时会把该路径拼在域名后,发起的请求地址是
http://tasty.taco.com/lib/bootstrap/xxx.css,该请求无法匹配Ingress配置的/web1//web2前缀规则,所以返回404 - 直接访问ClusterIP服务时没有前缀,应用根路径就是
/,所以静态资源请求路径完全匹配,没有问题。
解决方案
给你三种可落地的方案,按需选择:
方案1:修改Ingress配置+调整应用PathBase(推荐,保留路径前缀规则)
第一步:修改Ingress资源配置
将rewrite规则改为带捕获组的形式,同时添加X-Forwarded-Prefix头告知应用当前的路径前缀:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 name: taco-ingress spec: rules: - host: tasty.taco.com http: paths: - path: /web1(/|$)(.*) pathType: Prefix backend: service: name: web1 port: number: 80 - path: /web2(/|$)(.*) pathType: Prefix backend: service: name: web2 port: number: 80
第二步:给ASP.NET Core应用配置PathBase
在应用的Program.cs(.NET 6+)或Startup.cs(旧版本)中添加PathBase配置,让应用自动识别路径前缀生成正确的资源地址:
// Program.cs示例,在其他中间件之前添加 app.UsePathBase("/web1"); // web2应用就填/web2 app.UseStaticFiles(); // 保证静态资源也能识别路径前缀
重新打包镜像上传后重启Deployment即可。
方案2:使用子域名区分不同应用(最简单,无需修改应用代码)
给每个应用分配独立的子域名,去掉路径前缀配置,就不存在路径匹配问题:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: taco-ingress spec: rules: - host: web1.tasty.taco.com http: paths: - path: / pathType: Prefix backend: service: name: web1 port: number: 80 - host: web2.tasty.taco.com http: paths: - path: / pathType: Prefix backend: service: name: web2 port: number: 80
配置后分别通过http://web1.tasty.taco.com和http://web2.tasty.taco.com访问即可。
方案3:修改应用静态资源为相对路径(不推荐,维护成本高)
把HTML中所有/lib/xxx、/css/xxx的根路径引用改为相对路径,比如./lib/xxx,但这种方式需要修改所有页面的资源引用,后续迭代容易出问题。
内容的提问来源于stack exchange,提问作者Yatesu
相关产品推荐
相关产品推荐

