前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >获取用户的真实ip

获取用户的真实ip

作者头像
joshua317
发布于 2018-04-16 05:08:47
发布于 2018-04-16 05:08:47
4.5K0
举报
文章被收录于专栏:技术博文技术博文

做网站时候经常会用到remote_addr和x_forwarded_for 这两个头信息来获取,客户端ip,然而当有反向代理或者CDN的情况下,这两个就不够准确了,需要调整一些配置

remote_addr:

remote_addr 代表客户端的ip,但它的值不是由客户端提供的,而是服务端根据服务端的ip指定的,

当你的浏览器访问某个网站时候,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等) 就会把remote_addr设为你的机器ip

如果你用了某代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到 网站,这样web服务器就会把remote_addr设为这台代理机器的IP

x_forwarded_for(XFF)

x_forwarded_for 是用来识别通过HTTP代理或者负载均衡的方式连接web服务器的客户端最原始的IP地址的HTTP请求头字段

正如上面所述,当你使用了代理时,web服务器就不知道客户端访问的的真实IP了, 为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息, 把连接它的客户端IP(即你上网机器的IP)加到这个头信息里面,这样就能保证网站的web服务器能获取到客户端的真实IP

在反向代理架构中,不能通过REMOTE_ADDR来获取用户的真实ip!

一般的方式是这样:

nginx------->>(fastcgi方式)------->>php引擎

nginx把REMOTE_ADDR传递给了php。代表的是当前与nginx通信的客户端ip,一般情况下(非反向代理),这个客户就是用户的浏览器,所以得到的用户的ip。

假设做了反向代理架构,是下面这样子的:

用 户------->>服务器 a------->>nginx------->> (fastcgi方式通信)------->>php引擎

用户访问一个域名,实际上是通过服务器a做了转发,转发到nginx去(反向代理架构经常会这样部署)

于是,当前与nginx通信的客户端,就是服务器a的地址, REMOTE_ADDR就是a服务器的地址了。

总结:在nginx作为反向代理的架构中,php的REMOTE_ADDR(其他语言也是类似的名称)拿到的将会是nginx代理的ip地址。

拿不到用户的真实ip,拿到是nginx反向代理服务器地址。

REMOTE_ADDR本意就是远程的地址,nginx是代理层,转发请求到php,php获取到的远程地址实际上是nginx反向代理服务器ip,这是符合协议规则的。

但是,可以让nginx帮助我们拿到用户的真实ip,写到一个环境变量中,然后转发给我们,只要按照某个约定的名称即可,比如约定名称为HTTP_X_FORWARD_FOR(也可以约定其他名称,关键看nginx中配置)

其实Nginx中有一个$http_x_forwarded_for变量,这个变量中保存的内容就是请求中的X-Forwarded-For信息。如果后端获得X-Forwarded-For信息的程序兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),最好就不要将X-Forwarded-For设置为$proxy_add_x_forwarded_for应该设置为$http_x_forwarded_for或者干脆不设置!

nginx配置类似于这样:

fastcgi_param  HTTP_X_FORWARD_FOR  $remote_addr;

目的是,将HTTP_X_FORWARD_FOR的值设置为$remote_addr的值。也就是将用户真实的ip(或用户使用代理的ip)放到HTTP_X_FORWARD_FOR中去。

 $remote_addr是nginx的内置变量,这个变量它得到是用户真实的ip地址(用户使用了代理,则就是代理的ip地址)。

于是在php端通过getenv("HTTP_X_FORWARDED_FOR")就可以获取到nginx传递过来的值,是用户真实的ip地址。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-03-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nginx——关于获取真实ip
做网站时经常会用到remote_addr和x_forwarded_for这两个头信息来获取客户端的IP,然而当有反向代理或者CDN的情况下,这两个值就不够准确了,需要调整一些配置。
江小白
2018/07/16
5.2K0
nginx——关于获取真实ip
nginx域名访问的白名单配置梳理
在日常运维工作中,会碰到这样的需求:设置网站访问只对某些ip开放,其他ip的客户端都不能访问。可以通过下面四种方法来达到这种效果: 1)针对nginx域名配置所启用的端口(比如80端口)在iptables里做白名单,比如只允许100.110.15.16、100.110.15.17、100.110.15.18访问.但是这样就把nginx的所有80端口的域名访问都做了限制,范围比较大! [root@china ~]# vim /etc/sysconfig/iptables ...... -A INPUT -s
洗尽了浮华
2018/01/23
11.6K0
php获取用户真实IP和防刷机制
X-Forwarded-For(XFF):  是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段, 格式:clientip,proxy1,proxy2
smy
2018/11/28
4.9K0
php获取用户真实IP和防刷机制
Java服务器获取客户端的真实IP
首先,一个请求肯定是可以分为请求头和请求体的,而我们客户端的IP地址信息一般都是存储在请求头里的。如果你的服务器有用Nginx做负载均衡的话,你需要在你的location里面配置 X-Real-IP和 X-Forwarded-For请求头:
健程之道
2019/11/03
5K0
nginx获取请求真实IP
realip模块会修改remote_addr和remote_port,会用一个realip_remote_addr和realip_remote_port表示nginx原来的地址和端口
十毛
2021/07/14
3.4K0
Nginx 日志文件 access_log 详解
Module ngx_http_log_module nginx 日志相关指令主要有两条, 一条是log_format,用来设置日志格式, 另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小。 通俗的理解就是先用log_format来定义自己想用的日志格式,然后在用access_log定义日志时再把定义的log_format名称 跟在后面; 1、log_format 格式 log_format name(格式名字) string(格式样式即想要得到什么样的日志内容) 示例: log_
joshua317
2018/04/16
1.4K0
nginx反向代理获取客户端的真实IP和域名
nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。
用户7639835
2021/08/28
4.7K0
nginx proxy_set_header设置、自定义header
允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:
用户5640963
2019/07/26
17.8K0
在NGINX中根据用户真实IP限制访问
需要根据用户的真实IP限制访问, 但是NGINX前边还有个F5, 导致deny指令不生效.
东风微鸣
2022/04/21
2.8K0
在NGINX中根据用户真实IP限制访问
nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。 废话不多说,下面对测试环境下的nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)
洗尽了浮华
2018/01/22
3.3K0
nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
保姆级Nginx日志配置文件总结
Nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在Nginx的配置文件的日志配置(/usr/local/nginx/conf/nginx.conf)。
兔云小新LM
2023/03/24
2.8K0
客户端IP获取
从标准格式可以看出,X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。
码客说
2021/02/25
4.6K0
nginx $remote_addr
remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。
随心助手
2020/09/08
1.9K0
Nginx之反向代理
很多场景下,不得不承认Nginx是个好东西,它给我们的跨系统间的访问、安全性方面等等,带来了极大的便利,况且它的性能也极高。
xcbeyond
2020/04/01
8930
Nginx配置中的log_format用法梳理(设置详细的日志格式)
nginx服务器日志相关指令主要有两条:一条是log_format,用来设置日志格式;另外一条是access_log,用来指定日志文件的存放路径、格式和缓存大小,可以参加ngx_http_log_module。一般在nginx的配置文件中日记配置(/usr/local/nginx/conf/nginx.conf)。 log_format指令用来设置日志的记录格式,它的语法如下: log_format name format {format ...} 其中name表示定义的格式名称,format表示定义的格式
洗尽了浮华
2018/01/22
4.3K0
反向代理与 Real-IP 和 X-Forwarded-For
本文作者张开涛。为保障《亿级流量网站架构核心技术》一书内容的连续性,有些需要读者了解的内容,或者书的补充和引申内容,会通过二维码嵌入的方式引导读者阅读学习。大家可以关注作者公众号“开涛的博客”,并从菜单栏“我的新书”中查阅相关内容。
博文视点Broadview
2020/06/11
3.3K0
Nginx - 在Nginx中透传客户端真实IP的技巧
在使用 Nginx 作为反向代理服务器时,默认情况下,后端服务器只能看到 Nginx 的 IP 地址。为了记录日志、限制访问或进行其他基于 IP 地址的操作,获取客户端的真实 IP 地址非常重要。
小小工匠
2024/05/26
6.8K0
Nginx - 在Nginx中透传客户端真实IP的技巧
nginx之配置proxy_set_header问题梳理
将左侧匹配到的/proxy_path/开头的url全部转发到后端服务器 192.168.223.137。
小勇DW3
2019/12/20
9.3K0
nginx之配置proxy_set_header问题梳理
老大说,网上这种获取真实IP地址的方法不对,我不信
其中headers属性X-Forwarded-For,WL-Proxy-Client-IP不就是被更改了吗?
物流IT圈
2019/11/07
1.6K0
XFF那些事
X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最早引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案[1]中正式提出。
yumusb
2020/10/27
2.7K0
相关推荐
nginx——关于获取真实ip
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档