You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core如何捕获所有请求,实现旧链接跳转至新地址?

解决旧站点迁移后所有请求捕获与延迟重定向问题

问题根源

你之前带控制器路径的请求没被捕获,是因为中间件执行顺序不对——默认路由匹配会先于你的中间件运行,当请求路径找不到对应控制器时,ASP.NET直接返回404,你的中间件根本没机会处理。

解决方案

把迁移重定向的中间件放在所有中间件最前面(尤其是路由中间件之前),确保所有请求(包括路由匹配失败的)都先经过它。同时在中间件里生成包含原路径和参数的新地址,返回带延迟跳转的提示页面。

1. 实现迁移中间件

创建扩展方法封装中间件逻辑:

public static class MigrationMiddlewareExtensions
{
    public static IApplicationBuilder UseMigrationRedirect(this IApplicationBuilder app)
    {
        return app.Use(async (context, next) =>
        {
            // 排除静态文件,避免提示页面的CSS/JS/图片被错误重定向
            var requestPath = context.Request.Path.Value;
            var staticExtensions = new[] { ".css", ".js", ".png", ".jpg", ".ico", ".gif" };
            if (staticExtensions.Any(ext => requestPath.EndsWith(ext, StringComparison.OrdinalIgnoreCase)))
            {
                await next(context);
                return;
            }

            // 拼接原请求的完整路径(路径+查询参数)
            var fullOldPath = context.Request.Path + context.Request.QueryString;
            // 替换成你的新服务器基础地址
            var newServerBaseUrl = "https://newServer";
            var fullNewUrl = $"{newServerBaseUrl}{fullOldPath}";

            // 返回带延迟跳转的提示页面
            var redirectHtml = $@"
<!DOCTYPE html>
<html>
<head>
    <meta charset='UTF-8'>
    <title>站点迁移通知</title>
    <style>
        body {{ font-family: sans-serif; text-align: center; padding-top: 100px; }}
        .tip-box {{ max-width: 500px; margin: 0 auto; padding: 20px; border: 1px solid #eee; border-radius: 8px; }}
        .countdown {{ color: #e63946; font-weight: bold; }}
    </style>
</head>
<body>
    <div class='tip-box'>
        <h2>站点已迁移</h2>
        <p>我们的服务已迁移至新服务器,将在 <span class='countdown'>5</span> 秒后自动跳转至新地址。</p>
        <p>若未自动跳转,请点击 <a href='{fullNewUrl}'>手动跳转</a></p>
    </div>
    <script>
        let leftSeconds = 5;
        const countdownEl = document.querySelector('.countdown');
        const timer = setInterval(() => {{
            leftSeconds--;
            countdownEl.textContent = leftSeconds;
            if (leftSeconds <= 0) {{
                clearInterval(timer);
                window.location.href = '{fullNewUrl}';
            }}
        }}, 1000);
    </script>
</body>
</html>";

            context.Response.ContentType = "text/html; charset=utf-8";
            await context.Response.WriteAsync(redirectHtml);

            // 无需调用next,因为已经返回了响应,跳过后续中间件处理
        });
    }
}

2. 注册中间件

在Program.cs里把这个中间件放在最开头:

var builder = WebApplication.CreateBuilder(args);
// ...其他服务注册

var app = builder.Build();

// 迁移重定向中间件放在最前面!
app.UseMigrationRedirect();

// 之后才是其他中间件
app.UseRouting();
app.UseStaticFiles();
// ...其他中间件(比如授权、端点路由等)

app.Run();

关键说明

  • 执行顺序:把迁移中间件放在UseRouting()之前,确保所有请求(包括路由匹配失败的)都能被捕获。
  • 参数保留:通过context.Request.Path + context.Request.QueryString完整保留原请求的路径参数和查询参数,保证跳转后地址完全对应旧链接的内容。
  • 静态文件排除:避免提示页面自身的静态资源被重定向,保证页面正常显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:10:29