Blazor直接输入页面URL访问404 仅NavMenu点击可正常访问
问题根因
这是Blazor Server的典型路由回退配置缺失问题,两种访问行为的差异本质是请求链路不同:
- 点击NavMenu跳转属于Blazor运行时内部的客户端路由切换,全程不会向服务端发起页面请求,自然不会触发服务端404
- 直接在浏览器地址栏输入
https://localhost:5000/test访问时,请求会首先发送到服务端,服务端找不到匹配的物理路径或服务端路由规则时,会直接返回404响应,Blazor应用根本没机会加载,更走不到内部的组件路由匹配逻辑 - 你提到Blazor组件可以直接地址栏访问,只是因为你单独在
_Host.cshtml上给/blazor加了服务端@page路由,服务端能匹配到这个路由返回Blazor应用壳;/test没有对应的服务端路由匹配,就直接返回404空白。
修复方案
不需要给每个Blazor组件单独在_Host.cshtml加@page路由,只要配置全局路由回退规则,让所有非静态资源、非API/服务端接口的请求,统一回退到_Host.cshtml加载Blazor应用壳,后续路由交给Blazor客户端路由系统处理即可。
操作步骤
- 打开项目中的
Program.cs(.NET 6及以上版本)或Startup.cs(.NET 5及更早版本),找到中间件配置段 - 配置全局兜底路由,所有未匹配的非文件请求都指向
_Host.cshtml(注意要放在静态文件、API路由配置的后面):- .NET 6+ 最小API写法,替换原有零散的fallback配置:
app.MapFallbackToPage("/_Host");- .NET 5及更早版本,在
Configure方法的端点配置中添加:
endpoints.MapFallbackToPage("/_Host"); - 清理
_Host.cshtml上的冗余路由配置,只保留两个路由规则即可,删掉之前单独加的@page "/blazor"这类单组件路由:@page "/" @page "/{**path}" - 重启项目验证,此时直接在地址栏输入
/test路径,服务端会正常返回Blazor应用,再由客户端路由匹配到Test组件渲染,不会再出现404空白问题。
注意:如果项目有自定义的服务端页面、API接口、静态资源规则,要把这些中间件的配置顺序放在全局回退规则之前,避免被Blazor路由拦截。
内容的提问来源于stack exchange,提问作者thebernardlim
相关产品推荐
相关产品推荐

