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
相关产品推荐
相关产品推荐

