.NET Core 5 路径缺失指定子文件夹时的URL重定向问题求助
.NET Core 5 实现缺失/mytest/前缀的URL重定向
你之前的代码仅处理了根路径(空路径)的情况,无法覆盖mysite.com/mypage这类非根路径的请求。要实现所有不含/mytest前缀的请求都重定向到带该前缀的路径,可按以下方式调整:
正确的重写规则代码
在Startup.cs的Configure方法中,将重写逻辑修改为以下内容(注意中间件顺序,UseRewriter需放在UseRouting、UseStaticFiles之前):
app.UseRewriter(new RewriteOptions().Add(context => { var request = context.HttpContext.Request; var targetPrefix = "/mytest"; // 检查请求路径是否不以/mytest开头 if (!request.Path.StartsWithSegments(targetPrefix, StringComparison.OrdinalIgnoreCase)) { // 构造完整的目标URL:协议+主机+PathBase+目标前缀+原路径+查询字符串 var newPath = targetPrefix + request.Path; var redirectUrl = $"{request.Scheme}://{request.Host}{request.PathBase}{newPath}{request.QueryString}"; // 执行重定向,permanent设为true返回301(永久重定向),false则是302(临时) context.HttpContext.Response.Redirect(redirectUrl, permanent: true); // 终止后续中间件处理 context.Result = RuleResult.EndResponse; } }));
代码说明
- 使用
StartsWithSegments判断路径前缀,比直接字符串对比更可靠,能正确处理路径分隔符的边界情况 - 构造完整URL而非仅拼接路径,避免因
PathBase、协议/主机差异导致重定向错误 RuleResult.EndResponse确保重定向后不再触发后续中间件逻辑- 若需要排除特定路径(如健康检查接口),可在判断条件中添加排除项:
if (!request.Path.StartsWithSegments(targetPrefix, StringComparison.OrdinalIgnoreCase) && !request.Path.Equals("/healthcheck", StringComparison.OrdinalIgnoreCase))
完整Configure方法示例
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } // 重写中间件需放在路由、静态文件中间件之前 app.UseRewriter(new RewriteOptions().Add(context => { var request = context.HttpContext.Request; var targetPrefix = "/mytest"; if (!request.Path.StartsWithSegments(targetPrefix, StringComparison.OrdinalIgnoreCase)) { var newPath = targetPrefix + request.Path; var redirectUrl = $"{request.Scheme}://{request.Host}{request.PathBase}{newPath}{request.QueryString}"; context.HttpContext.Response.Redirect(redirectUrl, permanent: true); context.Result = RuleResult.EndResponse; } })); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
内容的提问来源于stack exchange,提问作者Amigo
相关产品推荐
相关产品推荐

