nginx反向代理后abp的webapi host如何获取客户端ip?
dotnet core 跨平台是微软伟大的创举,脱离iis后服务器成本都降低了。
问题
这不,采用abp搞了个小项目,部署到centos后发现审计日志里面的ip信息不对。

解决
这个问题在.net 4.5下处理过,记得当时是继承 WebClientInfoProvider重写GetClientIpAddress。
将代码拿来后发现dotnet core下报错。
跟进后发现 dotnet core下使用的是 Abp.AspNetCore.Mvc.Auditing下的:HttpContextClientInfoProvider
步骤一
修改代码如下,将其放在 xxx.Web.Core 的Extensions目录:
public class WebClientInfoProviderFix : IClientInfoProvider
{
public string BrowserInfo => GetBrowserInfo();
public string ClientIpAddress => GetClientIpAddress();
public string ComputerName => GetComputerName();
public ILogger Logger { get; set; }
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly HttpContext _httpContext;
/// <summary>
/// Creates a new <see cref="HttpContextClientInfoProvider"/>.
/// </summary>
public WebClientInfoProviderFix(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
_httpContext = httpContextAccessor.HttpContext;
Logger = NullLogger.Instance;
}
protected virtual string GetBrowserInfo()
{
var httpContext = _httpContextAccessor.HttpContext ?? _httpContext;
return httpContext?.Request?.Headers?["User-Agent"];
}
protected virtual string GetClientIpAddress()
{
try
{
var httpContext = _httpContextAccessor.HttpContext ?? _httpContext;
var headers = httpContext?.Request.Headers;
if (headers!=null&&headers.ContainsKey("X-Forwarded-For"))
{
httpContext.Connection.RemoteIpAddress = IPAddress.Parse(headers["X-Forwarded-For"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)[0]);
}
return httpContext?.Connection?.RemoteIpAddress?.ToString();
}
catch (Exception ex)
{
Logger.Warn(ex.ToString());
}
return null;
}
protected virtual string GetComputerName()
{
return null; //TODO: Implement!
}
}
步骤二
然后xxxWebCoreModule.cs中添加如下:
//jieky@2019-1-24 针对 获取客户端ip异常的处理
Configuration.ReplaceService(typeof(Abp.Auditing.IClientInfoProvider), () =>
{
IocManager.Register<Abp.Auditing.IClientInfoProvider, Extensions.WebClientInfoProviderFix>(Abp.Dependency.DependencyLifeStyle.Transient);
});
步骤三
nginx配置例子
server {
listen 5002;
access_log off;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:5000;
}
}
参考:
nginx反向代理后abp的webapi host如何获取客户端ip?的更多相关文章
- Nginx反向代理后应用程序获取客户端真实IP
Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的 ...
- nginx反向代理后getRequestURL会出现问题
nginx反向代理后getRequestURL会出现问题 http://huangqiqing123.iteye.com/blog/1895192
- JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)
1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...
- 关于nginx反向代理后获取不到客户端的真实ip地址问题
前段时间在我的网站上用nginx做了一下反向代理,最近发现不能获取客户端ip了,都是拿到的127.0.0.1的本地ip... 通过查资料后,再去看了看我的配置文件,结果发现我没有如下配置: nginx ...
- nginx反向代理后应用程序如何获取客户端真实IP
每个location中增加配置: proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_se ...
- Nginx反向代理后,java获取客户端真实IP地址
一般情况下,java获取客户端IP地址的方法为request.getRemoteAddr();但这只是在没有网关或者代理的情况下,如果客户端将请求发送到nginx,再由nginx进行反向代理到目标服务 ...
- Nginx反向代理+DNS轮询+IIS7.5 千万PV 百万IP 双线 网站架构案例
原文地址:http://www.jb51.net/article/31844.htm Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 ...
- 关于配置Nginx反向代理后SpringSecurity认证失败的问题解决
问题背景 最近在写的一个项目,采用前后端分离的方式进行开发,登录认证使用的是SpringSecurity框架. 问题描述 在项目部署的时候出现了一个问题,在自己电脑上运行的时候一切顺畅,可是部署到服务 ...
- nginx 反向代理报400错误与Host关系
转载自:https://blog.csdn.net/qq_22208737/article/details/80787396 如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段 ...
随机推荐
- 30.概述strust2中的拦截器
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 拦截器是Struts2框架的核心,它主要完成解析请求参数.将请求参数赋值给A ...
- 学习Maven之PropertiesMavenPlugin
1.PRoperties-maven-plugin是个什么鬼? 介绍前我们先看一个问题,比如我们有一个maven项目结构如下:一般我们都把一些配置文件放到像src/main/resources/jdb ...
- 可视化库-Matplotlib-Pandas与sklearn结合(第四天)
1. 计算每一种的比例的百分比 import pandas as pd from matplotlib.ticker import FuncFormatter np.random.seed(0) df ...
- (网页的缓存控制)HTML配置no-cache(备忘) “Cache-control”常见的取值
HTML配置no-cache(备忘) No-cache配置 html表头如下 <meta http-equiv="Content-Type" content="te ...
- 8.3.2018 1 Quick and dirty 快而脏的快餐
Quick and dirty 快而脏的快餐 BEIJING 北京 Food delivery is a booming business. Waste is piling up, too 送餐 ...
- Linux学习---Linux目录结构说明
1./- 根 每一个文件和目录从根目录开始. 只有root用户具有该目录下的写权限.请注意,/root是root用户的主目录,这与/.不一样 2./bin中 - 用户二进制文件 包含二进制可执行文件. ...
- Spring分配置文件开发
---------------------siwuxie095 Spring 分配置文件开发 Spring 分配置文件开 ...
- kafka常用运维命令
列出所有topic:bin/kafka-topics.sh --zookeeper localhost:2181 --list说明:其实就是去检查zk上节点的/brokers/topics子节点,打印 ...
- Java程序设计10——与运行环境交互
本部分介绍一些与运行环境相关的类 Sun为Java提供了丰富的基础类库,Java SE有三千多个基础类,要多敲代码,多练. 1.main()方法解析 如果一个程序总是按规定的流程运行,无需处理用户动作 ...
- ScreenCapture-HDwik5.0整合教程
示例下载:http://yunpan.cn/Q9qzFmf6sF57z 1.上传ScreenCapture文件夹 2.上传upload.php文件 2.1修改upload.php路径 3.修改Scre ...