文章目录
-
- [1. ForwardedHeaders](#1. ForwardedHeaders)
-
- [1.1 场景](#1.1 场景)
- [1.2 关键的HTTP头](#1.2 关键的HTTP头)
- [1.3 核心处理要点](#1.3 核心处理要点)
1. ForwardedHeaders
1.1 场景
- 获取用户IP
- 获取用户请求的原始URL
1.2 关键的HTTP头
- X-Forwarded-For
- X-Forwarded-Proto
- X-Forwarded-Host
1.3 核心处理要点
-
设置PathBase
-
设置ForwardedHeaders中间件
-
设置受信任的网关或代理的IP段
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<ForwardedHeadersOptions>(options =>
{
// 默认情况下ForwardedHeadersOptions有默认的设置和代理,这里要清除掉
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
options.ForwardedHeaders = ForwardedHeaders.All;// 允许输出所有类型头
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (Configuration.GetValue("USE_PathBase", false))
{
app.Use((context, next) =>
{
context.Request.PathBase = new PathString("/mobile");
return next();
});
}if (Configuration.GetValue("USE_Forwarded_Headers", false)) { app.UseForwardedHeaders(); } // 通过上述两段代码就可以使应用程序正确感知到用户的原始响应,默认情况下应用程序是没有开启这两段设置的
}
// 控制器测试
[HttpGet]
public IActionResult ShowRequestUri()
{
return Content(Request.GetDisplayUrl());
}[HttpGet]
public IActionResult ShowHeaders()
{
var sb = new System.Text.StringBuilder();
foreach (var item in Request.Headers)
{
sb.AppendLine($"{item.Key}:{item.Value}");
}return Content(sb.ToString());
}
UseForwardedHeaders 作用是将当前的请求X-Forwarded-Header应用到HTTP Context上,作用是是应用程序在组装当前的请求地址时使用到正确的地址
通过以上设置,应用程序输出真实的请求地址,网关中不需要设置