.NET Core 7 Razor Pages路由本地化:无效路由/文化未跳转404问题
解决无效文化/无效路由跳转404的问题
原因分析
当访问/abc这类地址时,RouteDataRequestCultureProvider会优先从路由数据里提取culture值,此时abc会被当作文化标识,但它不在你配置的支持列表(en、pt)中,系统不会直接返回404,而是带着这个无效文化继续处理后续路由,导致错误处理逻辑没按预期触发。
解决方案步骤
1. 添加自定义文化验证中间件
在Program.cs里加一个中间件,专门检查路由中的culture是否合法,无效就直接返回404:
var supportedCultures = new[] { "en", "pt" }; var defaultCulture = "pt"; // 该中间件要放在UseRouting之后,UseRequestLocalization之前 app.Use(async (context, next) => { if (context.Request.RouteValues.TryGetValue("culture", out var cultureValue) && cultureValue is string culture && !supportedCultures.Contains(culture)) { context.Response.StatusCode = StatusCodes.Status404NotFound; await context.Response.StartAsync(); return; } await next(); });
2. 调整本地化配置
确保RequestLocalizationOptions配置正确,同时保留默认文化回退逻辑:
var localizationOptions = new RequestLocalizationOptions { DefaultRequestCulture = new RequestCulture(defaultCulture), SupportedCultures = supportedCultures.Select(c => new CultureInfo(c)).ToList(), SupportedUICultures = supportedCultures.Select(c => new CultureInfo(c)).ToList() }; localizationOptions.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider { RouteDataStringKey = "culture", Options = localizationOptions }); app.UseRequestLocalization(localizationOptions);
3. 完善错误页路由配置
在Error.cshtml顶部设置兼容带/不带文化的路由模板:
@page "/{culture?}/error/{statusCode?}" @model ErrorModel
Error.cshtml.cs中处理状态码参数:
public class ErrorModel : PageModel { public string? RequestId { get; set; } public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); private readonly ILogger<ErrorModel> _logger; public ErrorModel(ILogger<ErrorModel> logger) { _logger = logger; } public void OnGet(int? statusCode = null) { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; // 可根据statusCode添加对应错误逻辑 } }
4. 验证效果
- 访问
/abc:中间件检测到无效文化,直接返回404并跳转到/error/404 - 访问
/en/invalid-page:文化有效但路由无效,原有错误逻辑触发404跳转 - 访问
/contact:自动使用默认文化pt,正常加载页面
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

