nginx负载CDN加速的真实IP
nginx负载CDN加速的真实IP
当nginx负载没有CDN获得真正的IP,nginx的配置如下:
java代码
美元proxy_set_header主机主机;
proxy_set_header x-real-ip remote_addr美元;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for美元;
然后后端服务器获取IP代码:
java代码
复制代码代码如下所示:
字符串地址= request.getheader(X-Forwarded-For );
如果(地址)!= null address.length()> 0
未知的。EqualsIgnoreCase(地址)){
返回地址;
}
地址= request.getheader(代理ip);
如果(地址)!= null address.length()> 0
未知的。EqualsIgnoreCase(地址)){
返回地址;
}
地址= request.getheader(WL代理客户端IP);
如果(地址)!= null address.length()> 0
未知的。EqualsIgnoreCase(地址)){
返回地址;
}
返回request.getremoteaddr();
通过这种方式,您可以获得真正的IP,服务器将测试它:
而CDN,获取IP:123.116.126.51(我目前的客户机的真实IP)
然后加入CDN,然后去IP:123.116.126.51,202.108.251.166(主机点CDN的IP)。
也就是说:客户端真正的IP,代理IP,谷歌,
X-Forwarded-For:被称为xff头。它表示客户端,即HTTP请求端的真正IP。只有在使用HTTP代理或负载平衡服务器时才添加它。
标准格式如下:
X-Forwarded-For:客户,proxy1,proxy2
从标准的格式,我们可以看到,X-Forwarded-For头信息可以有多个,中间用逗号隔开,第一个是客户端真实IP,其余的IP地址已被代理或负载平衡通过,和几个会出现在几个。
当nginx设置X-Forwarded-For等于proxy_add_x_forwarded_for美元,有两例
1、如果请求不设置从CDN X-Forwarded-For头(通常这种事情不会发生),和我们的nginx的设置设置为proxy_add_x_forwarded_for,X-Forwarded-For信息应该是CDN的IP,因为相对于Nginx的负载平衡,说客户的CDN,在这种情况下,后端网络生活时可以得到用户真实IP。
2、CDN X-Forwarded-For设置,我们也都在这里建立一次,和proxy_add_x_forwarded_for美元的价值,那么X-Forwarded-For内容IP CDN ip客户端,如果是这种情况,后台进程通过X-Forwarded-For获取IP的客户端,以逗号分隔的第一。
这是个头痛的问题。如果您只想获得客户机真正的IP,那么我们只能修改后端代码。如果有很多,那就拿第一个,这不是我想要的,
那么我们怎样才能在不修改它的情况下制造出真正的IP呢
也有在Nginx http_x_forwarded_for美元的变量,并将其存储在X-Forwarded-For信息的请求。如果X-Forwarded-For信息程序兼容性在后端不好(不考虑X-Forwarded-For包含多个IP的情况),最好不要设置X-Forwarded-For proxy_add_x_forwarded_for.should美元将http_x_forwarded_for美元或者不成立!
这意味着我们不加proxy_add_x_forwarded_for美元,但并非如此,CDN的情况下将继续获得任何真正的IP,这是一个双赢的办法
在多个配置之后,找到以下配置:
java代码
proxy_set_header X-Forwarded-For http_x_forwarded_for美元;
proxy_set_header X-Forwarded-For proxy_add_x_forwarded_for美元;
这种配置需要得到http_x_forwarded_for美元第一次,如果它不存在,然后proxy_add_x_forwarded_for美元。
这允许您获得客户机IP,而不管它是否在CDN环境中。
(注:未经测试的多层代理)