MVC6应用部署于代理后端时RedirectToAction失效,求原因
MVC6代理环境下RedirectToAction失效问题排查与解决
我有一个部署在代理后端的MVC6应用,为此配置了如下代理地址处理逻辑:
app.Use((context, next) => { var hostHeader = context.Request.Headers["X-Forwarded-Host"]; string serviceManagerHeader = string.Empty; if (hostHeader.Any()) { serviceManagerHeader = hostHeader.First().Substring(hostHeader.First().IndexOf('/') + 1); } context.Request.PathBase = hostHeader.Any() ? $"/{serviceManagerHeader}".TrimEnd('/') ://from SM string.Empty; return next(); });配置后代理环境下其他功能均正常,但RedirectToAction功能失效,请问原因是什么?
问题根源
手动设置PathBase的方式未被ASP.NET Core的URL生成系统正确识别。RedirectToAction依赖框架内置的URL生成逻辑,该逻辑需要HttpContext中Request.Scheme、Request.Host和PathBase等参数的完整正确配置才能生成合法的重定向URL。你的代码仅修改了PathBase,未同步更新Request.Host,也没有确保框架的URL生成组件感知到这些变更,导致生成的重定向URL缺少正确的代理路径前缀,最终跳转失效。
另外,代码对X-Forwarded-Host的处理存在潜在bug:如果Header值中不包含/,IndexOf('/')会返回-1,此时Substring(0)会取整个Host字符串,可能导致PathBase设置错误。
推荐解决方案:使用官方ForwardedHeaders中间件
ASP.NET Core内置了专门处理代理转发的ForwardedHeadersMiddleware,无需自定义逻辑,配置步骤如下:
- 注册并配置服务:
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedProto; // 若代理服务器为可信来源,添加其IP到KnownProxies或KnownNetworks // options.KnownProxies.Add(IPAddress.Parse("你的代理服务器IP")); });
- 在管道中尽早启用该中间件(必须在
UseRouting之前):
app.UseForwardedHeaders(); app.UseRouting(); // 后续中间件配置...
自定义逻辑修复方案(若需保留原有逻辑)
如果必须使用自定义中间件,需同步更新Request.Host并确保PathBase设置正确,修改后的代码如下:
app.Use((context, next) => { var hostHeader = context.Request.Headers["X-Forwarded-Host"].FirstOrDefault(); if (!string.IsNullOrEmpty(hostHeader)) { // 拆分主机地址和路径前缀部分 var hostSegments = hostHeader.Split(new[] {'/'}, 2); if (hostSegments.Length == 2) { // 更新Request.Host为代理传递的主机地址 context.Request.Host = new HostString(hostSegments[0]); // 设置正确的PathBase context.Request.PathBase = $"/{hostSegments[1]}".TrimEnd('/'); } else { // 若Header中仅包含主机地址,直接更新Host context.Request.Host = new HostString(hostHeader); } } return next(); });
修改后,RedirectToAction依赖的URL生成逻辑能获取到完整正确的请求上下文参数,生成符合代理环境要求的重定向URL,恢复功能正常。
内容的提问来源于stack exchange,提问作者miri W.
相关产品推荐
相关产品推荐

