You need to enable JavaScript to run this app. Blazor Server应用经K8s Traefik Ingress暴露时路由404配置问询
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Server应用经K8s Traefik Ingress暴露时路由404配置问询

Blazor Server 经 Traefik Ingress 暴露后路由404的修复方案

核心问题根因

配置异常来自两个维度的不匹配:

  • Ingress路由规则与Traefik语法不兼容:使用了已废弃的networking.k8s.io/v1beta1 API定义、旧版重写注解缺少正则路径捕获逻辑,且未指定pathType导致仅能精确匹配单个路径,无法覆盖应用的所有子路由,最终转发到后端的路径与Blazor应用实际监听的路径不匹配
  • 应用侧与Ingress暴露路径不匹配:Blazor应用默认以根路径为基路径,没有适配Ingress的/passthrough前缀,且缺少对Blazor SignalR长连接(WebSocket)的转发规则支持,客户端触发路由跳转时无法命中应用的fallback路由规则,返回404

分步修正配置

1. 替换过时的Ingress定义

移除原有v1beta1的API声明,改用稳定的v1版本Ingress定义,搭配Traefik专属的路径匹配、请求头透传规则,同时剥离后端不需要的路径前缀。
首先需要提前创建Traefik的前缀剥离中间件(Traefik中间件需部署在Traefik所在的kube-system命名空间):

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: strip-passthrough-prefix
  namespace: kube-system
spec:
  stripPrefix:
    prefixes:
      - /passthrough

然后调整原有的Ingress配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-test
  annotations:
    kubernetes.io/ingress.class: "traefik"
    # 关联前缀剥离中间件
    traefik.ingress.kubernetes.io/router.middlewares: kube-system-strip-passthrough-prefix@kubernetescrd
    # 透传请求协议头,适配Blazor的WebSocket安全连接要求
    traefik.ingress.kubernetes.io/headers.custom-request-headers: |
      X-Forwarded-Proto=https
spec:
  rules:
  - http:
      paths:
        - path: /passthrough
          # 明确指定路径匹配类型为前缀匹配,适配所有子路由
          pathType: Prefix
          backend:
            service:
              name: driverpassthrough
              port:
                number: 8010

注意:如果直接通过域名根路径暴露Blazor应用(无/passthrough前缀),则不需要配置前缀剥离中间件,将Ingress路径直接设为/、pathType设为Prefix即可,无需额外重写规则。

2. 修正Blazor应用的路径适配逻辑

因为应用被前缀路径暴露,必须在应用侧同步配置基路径,否则前端路由、静态资源加载都会默认请求根路径,触发404:

  • 在应用的Program.cs中,配置请求管道前添加基路径声明:
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddRazorPages();
    builder.Services.AddServerSideBlazor();
    var app = builder.Build();
    
    // 声明应用匹配的基路径,与Ingress的/passthrough前缀对应
    app.UsePathBase("/passthrough");
    
    app.UseStaticFiles();
    app.UseRouting();
    // 配置Blazor实时Hub的路径,匹配基路径前缀
    app.MapBlazorHub("/passthrough/_blazor");
    app.MapFallbackToPage("/_Host");
    
  • 在Blazor应用的根组件页面(默认为Pages/_Host.cshtml)的<head>标签内,补充前端路由基路径:
    <base href="/passthrough/" />
    

验证排查要点

  • 配置修改完成后,先通过curl http://<ingress暴露地址>/passthrough 校验首页是否正常返回,排除客户端缓存干扰
  • 打开浏览器开发者工具的网络面板,确认路由跳转时的请求路径均携带/passthrough前缀,不存在直接请求根路径下路由的情况
  • 检查网络请求中WebSocket连接(对应路径/passthrough/_blazor)的状态为101升级成功,若连接失败需确认Traefik未拦截Upgrade、Connection请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 21:15:04