在.net core 中怎么实现访问不存在的路由 自动跳转到主页

在 ASP.NET Core 中,如果您希望用户访问一个不存在的路由时自动跳转到主页(通常是“首页”),您可以通过以下几种方法来实现。

方法一:使用 UseStatusCodePagesWithRedirects 中间件

ASP.NET Core 提供了一个内置的中间件 UseStatusCodePagesWithRedirects,它可以帮助您实现访问不存在的路由时跳转到指定的页面。通常,访问一个不存在的路由会返回 404 错误,您可以使用这个中间件来捕捉 404 错误并重定向到主页。

步骤:

  1. Startup.cs(或 Program.cs,取决于您使用的版本)文件中的 Configure 方法中,添加 UseStatusCodePagesWithRedirects 中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 如果是生产环境,则使用默认的错误页面
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    // 处理404错误,自动跳转到主页
    app.UseStatusCodePagesWithRedirects("/");

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
}

解释:

  • app.UseStatusCodePagesWithRedirects("/") 会捕获所有返回 404 状态码的请求,并将其重定向到主页(/)。
  • 这里的 / 是主页的 URL,也可以根据您的需求进行修改。

方法二:自定义 404 错误页面并跳转

如果您想要更多的控制,您可以通过创建一个自定义的 404 错误页面,然后在该页面内执行重定向逻辑。

步骤:

  1. Startup.cs 中使用 UseStatusCodePagesUseExceptionHandler 来自定义错误页面:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    // 自定义404错误处理
    app.UseStatusCodePagesWithReExecute("/Home/NotFound");

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
}
  1. 在控制器中创建一个 NotFound 动作:
public class HomeController : Controller
{
    // 主页
    public IActionResult Index()
    {
        return View();
    }

    // 自定义404页面
    public IActionResult NotFound()
    {
        // 你可以在这里返回一个自定义的视图,也可以在视图中直接进行跳转
        return RedirectToAction("Index");  // 跳转到首页
    }
}

方法三:使用 UseMvcMapFallbackToController

如果您希望在所有路径(包括前端路由)都无法匹配时自动跳转到主页(比如,单页应用程序中的前端路由),您可以使用 MapFallbackToController

示例:

  1. Startup.cs 配置路由:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他配置...

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        // 默认路由
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");

        // 处理不存在的路由
        endpoints.MapFallbackToController("Index", "Home");
    });
}

解释:

  • MapFallbackToController("Index", "Home") 会将所有未匹配的路由重定向到 HomeControllerIndex 动作。

总结:

  • UseStatusCodePagesWithRedirects:适合直接处理 HTTP 错误状态(如 404)并进行重定向。
  • 自定义404处理:可以提供更多的控制,允许您展示自定义的错误页面,或在错误页面中进行跳转。
  • MapFallbackToController:适用于单页应用程序或希望捕捉所有未匹配的路由并跳转到主页的场景。

根据您的需求,可以选择最适合您的方法来实现这一功能。

在你提供的代码中,想要实现当用户访问不存在的路由时自动跳转到主页,你可以通过以下几个步骤来实现:

  1. 使用 UseStatusCodePagesWithRedirects 中间件捕获404错误并重定向到主页。
  2. 确保在路由匹配时处理所有未匹配的路径。

修改步骤

1. 使用 UseStatusCodePagesWithRedirects 捕获404错误并重定向

你可以在 Configure 方法中添加 UseStatusCodePagesWithRedirects 中间件来处理 404 错误,并将其重定向到主页。

将以下代码添加到 app 的配置中:

csharp
app.UseStatusCodePagesWithRedirects("/");

这行代码将会捕获所有 404 错误并将请求重定向到 /(即主页)。

2. 使用 MapFallbackToController 来捕获所有未匹配的路由

如果你希望在路由没有匹配到控制器动作时,也自动跳转到主页,可以通过 MapFallbackToController 方法来实现。这个方法会在所有路由无法匹配时,重定向到指定的控制器动作。

Configure 方法的 app.UseRouting(); 后面添加如下代码:

csharpapp.UseRouting();

app.MapFallbackToController("Index", "Home");  // 默认跳转到 HomeController 的 Index 动作

完整的代码示例

csharpvar builder = WebApplication.CreateBuilder(args);

// 其他服务配置...

var app = builder.Build();

// 配置 HTTP 请求管道
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseSession();
app.UseStaticFiles(new StaticFileOptions
{
    ServeUnknownFileTypes = true
});

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

// 捕获 404 错误并重定向到主页
app.UseStatusCodePagesWithRedirects("/");

// 添加 CORS 策略
app.UseCors("CorsPolicy");

// 启用认证和授权
app.UseAuthentication();
app.UseAuthorization();

app.UseRouting();

// 配置未匹配的路由跳转到主页
app.MapFallbackToController("Index", "Home");

// 配置默认路由
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

解释:

  • app.UseStatusCodePagesWithRedirects("/"): 这行代码会捕获所有 HTTP 错误(特别是 404 错误),并将用户重定向到主页 (/)。
  • app.MapFallbackToController("Index", "Home"): 如果请求的路由无法匹配到任何控制器动作,ASP.NET Core 会默认执行 HomeControllerIndex 动作,通常用来显示主页。

这样,当用户访问不存在的 URL 时,应用将会自动将其重定向到主页。