项目

转发头处理

反向代理和负载均衡器在现代Web应用架构中扮演着关键角色。当应用程序部署在这些代理和负载均衡器之后时,可能会出现若干特定问题。本文档将详细讨论这些问题,解释ASP.NET Core的转发头中间件如何解决它们,并提供在ABP应用中配置转发头的代码示例。

反向代理环境中的潜在问题

当请求经过反向代理或负载均衡器时,可能会出现以下常见问题:

1. 原始请求信息丢失

反向代理或负载均衡器通常会修改原始HTTP请求头。例如,代理可能会替换客户端的X-Forwarded-For头,或者将Host头设置为代理地址。这会导致后端应用无法直接访问客户端的真实IP地址、真实主机名和使用的协议。

2. HTTPS与HTTP协议混淆

当请求被代理服务器转发时,通常会升级为HTTPS以确保安全传输。代理服务器会发送如X-Forwarded-Proto的头来指示原始请求是HTTP还是HTTPS。如果后端应用未能正确处理此头信息,可能会生成错误协议的URL。

3. 路径处理问题

由于负载均衡器和代理可能会以不同方式修改或映射请求URL路径,后端应用可能会遇到路径不一致的问题。例如,反向代理可能将来自/api的请求转发到/myapp/api。如果后端应用未正确配置,可能会出现路径解析错误。

4. IP地址与安全问题

反向代理可能会用自己的IP地址替换原始客户端IP地址,这会影响日志记录、认证和访问控制机制。要获取真实的客户端IP地址,必须正确解析并信任X-Forwarded-For头。

5. 负载均衡器影响

负载均衡器可能使用不同算法将请求分发到不同的后端服务器。这会导致会话亲和性问题。如果会话数据存储在单个服务器上,而负载均衡器将后续请求定向到不同服务器,则可能出现会话丢失或不一致。

ABP Web应用中的转发头中间件

为解决上述问题,ASP.NET Core提供了内置的ForwardedHeadersMiddleware中间件,用于处理反向代理转发的头信息。该中间件帮助应用恢复正确的原始请求信息,如客户端IP地址、协议和主机。

配置ForwardedHeadersMiddleware

ASP.NET Core的ForwardedHeadersMiddleware支持多个HTTP头:

  • X-Forwarded-For:包含原始客户端的IP地址
  • X-Forwarded-Proto:指示原始请求是HTTP还是HTTPS
  • X-Forwarded-Host:包含客户端请求的原始主机
  • X-Forwarded-Port:指示请求的原始端口

配置此中间件的步骤:

  1. 在模块的ConfigureServices方法中配置ForwardedHeadersOptions
public override void ConfigureServices(ServiceConfigurationContext context)
{
	context.Services.Configure<ForwardedHeadersOptions>(options =>
	{
		options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
	});
}
  1. 在模块的OnApplicationInitialization方法中添加中间件:

转发头中间件应在其他中间件之前运行。这种顺序确保依赖转发头信息的中间件可以使用头值进行处理。转发头中间件可以在诊断和错误处理之后运行,但必须在调用UseHsts之前运行:

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
	var app = context.GetApplicationBuilder();
	var env = context.GetEnvironment();

	if (env.IsDevelopment())
	{
		app.UseDeveloperExceptionPage();
		app.UseForwardedHeaders();
	}
	else
	{
		app.UseErrorPage();
		app.UseForwardedHeaders();
		app.UseHsts();
	}

	// 其他中间件配置...
}

参考文档

在本文档中