公司项目最近出现获取访问域名、端口、IP错误现象,通过排查发现, 之前项目一直通过Nginx自定义Headers信息来获取,但最近运维人员失误操作造成自定义Header信息丢失,造成项目拿不到对应的数据。思前想后,想找找官方有没有关于此类问题通用标准化的解决方案。
一、Nginx配置如下:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_cache_bypass $http_upgrade;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout ;
proxy_send_timeout ;
proxy_read_timeout ;
proxy_buffers 4k;
二、.Net Framework Headers 转接头替换方案
在web.congfig文件中通过配置aspnet:UseHostHeaderForRequestUrl解决:
<appSettings>
<add key="aspnet:UseHostHeaderForRequestUrl" value="true"/>
</appSettings>
三、.Net Core Header 转接头替换方案
Startup.cs 中 Configure 函数 添加如下配置
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
通过上面的配置后发现通过 HttpContext.Current.Connection.RemoteIpAddress 还是获取不到代理前的数据,仔细读了官方文档后发现,此配置只对Nginx与项目同时部署在同一台server(本机localhost)时有效,多台server需在项目中配置代理的IP地址才能有效的替换转接头信息,代码如下:
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
KnownProxies = { IPAddress.Parse("172.17.0.0") }
});
也可通过KnownNetworks属性配置代理地址范围。官方文档地址: 点击这里
自此该问题已完美解决,有了标准化的配置方案,减少技术人员更替对项目的不熟造成的一些失误。