首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

$_SERVER[“REMOTE_ADDR”]给出的是服务器IP而不是访问者IP

$_SERVER["REMOTE_ADDR"] 是 PHP 中的一个超全局变量,用于获取客户端(通常是浏览器)的 IP 地址。然而,在某些情况下,这个变量可能会返回服务器的 IP 地址而不是访问者的 IP 地址。这种情况通常发生在以下几种情况:

原因

  1. 反向代理:如果你的网站部署在通过反向代理(如 Nginx 或 Apache)的环境中,代理服务器可能会修改 REMOTE_ADDR 头部信息,使其指向代理服务器自身的 IP 地址。
  2. 负载均衡:在使用负载均衡器的情况下,负载均衡器可能会修改 REMOTE_ADDR 头部信息,使其指向负载均衡器的 IP 地址。
  3. 本地开发环境:在本地开发环境中,如果你通过 localhost127.0.0.1 访问你的网站,REMOTE_ADDR 将会是 127.0.0.1,即本地服务器的 IP 地址。

解决方法

为了获取真实的客户端 IP 地址,你可以尝试以下几种方法:

方法一:检查 X-Forwarded-For 头部

反向代理服务器通常会在请求头部添加 X-Forwarded-For 头部,其中包含了客户端的真实 IP 地址。你可以这样获取:

代码语言:txt
复制
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip_address = $_SERVER['REMOTE_ADDR'];
}

方法二:使用 getenv() 函数

你也可以使用 getenv() 函数来获取 REMOTE_ADDR

代码语言:txt
复制
$ip_address = getenv('REMOTE_ADDR');

方法三:配置反向代理服务器

如果你有权限配置反向代理服务器,可以在代理服务器上设置 proxy_set_header 指令,将客户端的真实 IP 地址传递给后端服务器。例如,在 Nginx 中:

代码语言:txt
复制
server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

然后在 PHP 中使用 X-Real-IP 头部:

代码语言:txt
复制
if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
    $ip_address = $_SERVER['HTTP_X_REAL_IP'];
} else {
    $ip_address = $_SERVER['REMOTE_ADDR'];
}

应用场景

获取客户端 IP 地址的应用场景非常广泛,包括但不限于:

  1. 日志记录:记录访问者的 IP 地址以便进行访问日志分析。
  2. 地理位置定位:根据 IP 地址确定访问者的地理位置。
  3. 安全防护:用于识别和阻止恶意访问者的 IP 地址。

参考链接

通过以上方法,你应该能够正确获取访问者的真实 IP 地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Docker - 解决 gitlab 容器上项目进行 clone 时,IP 地址显示一串数字不是正常 IP 地址问题

问题背景 通过 gitlab 容器创建了一个项目,想 clone 到本地,结果发现项目的 IP 地址一串数字 ? 问题排查 明明创建项目的时候,IP 地址还是正常鸭! ?...解决方案 先说下我创建 gitlab 容器语句 进行了目录映射 docker run -d -p 443:443 -p 9001:80 -p 8022:22 \ --name gitlab \ -...将这个 external_url 改成主机 IP,不需要加端口哦 保存! 重启 gitlab 容器 docker restart gitlab 修改成功 ?...注意事项一 如果重启 gitlab 容器,访问网页时候报 502,可以参考这篇文章解决 https://www.cnblogs.com/poloyy/p/13883500.html 注意事项二 如果没有映射目录

1.9K10
  • 如何解决WordPress开启CDN后评论IP不正确方法

    只要添加一段代码,IP地址就可以正常了,其实CDN在头部应该有把访问者IP发送,那段代码就是把wordpressip中变量换成$_SERVER获取。...这个可以用在任意CDN和反代里面,IP地址可以获取正确 用过CDN朋友都知道,如果WordPress开启CDN之后别人在你文章中评论,IP则显示该人所在地区CDN节点IP不会显示该人真实...']); $_SERVER['REMOTE_ADDR'] = $list[0]; } 我们要把里面的 HTTP_X_FORWARDED_FOR 更改成为自己所用CDN来源IP端口,例如百度智能云就为...($_SERVER['REMOTE_ADDR'], “”,$_SERVER["HTTP_X_REAL_IP"])); if ($_SERVER["HTTP_X_REAL_IP"] !...= “”) {$_SERVER['REMOTE_ADDR'] = $IP; } else { $_SERVER['REMOTE_ADDR'] = $_SERVER['REMOTE_ADDR']; }}add_action

    61920

    人工智能专用芯片大势所趋,IP授权当前实现商业化最佳选择 | 深度

    人工智能芯片热度渐 多家公司早已着手布局 前段时间,因为被看做当前智能家居入口之一,“智能音箱”一下子受到了人们极大关注,随着小爱同学、天猫精灵等产品相继推出,更是将这股热潮推上了顶端。...届时,不管所需要处理数据,抑或是运算速度,与现在相比都将不是一个量级,若想做更好,就只能向人工智能专用芯片靠拢。 ?...人工智能专用芯片商业化 IP授权当前最佳出路 随着寒武纪成为AI芯片领域首个“独角兽”、华为麒麟970推出,以及后面苹果、三星等多家重量级厂商相继宣布AI芯片规划,“如何实现技术、产品商业化落地...谈及商业化,虽然中星微、寒武纪产品此前都有所流片,但是从当前整体来看的话,相比于流片,IP授权或许更适合人工智能专用芯片,尤其对于创企而言。...相比之下,通过IP授权来慢慢拉拢客户构建生态圈、“蚕食”人工智能芯片市场显得更为从容有序。 说到IP授权,我们第一个想到就是ARM,作为后起之秀它通过IP授权策略打败了当时业内老大Intel。

    51800

    nginx负载均衡

    一、nginx负载均衡: 1.1 负载均衡原理: 多台服务器绑定一个域名,当A用户访问WEB服务器时候,可能访问A服务器,当B用户访问WEB服务器时候可能A服务器也可能B服务器,但是一旦A服务器挂掉后...,Nginx负载均衡会自动把所有的访问者全部指向另外一个可以正常工作WEB server. 1.2 配置: [[email protected]03 ~]# vim /usr/local/nginx.../conf/vhost/load.conf upstream qq_com { ip_hash; server 61.135.157.156:80; server 125.39.240.113...http://qq_com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr...服务器上 upstream qq_com:定义一个名称; upstream下面可以定义多个server:port server_name www.qq.com;定义域名 proxy_pass http:

    1.1K60

    Nginx反向代理配置

    反向代理 反向代理(Reverse Proxy)一种网络服务器部署模式,其代理请求方向与正常代理服务器相反,即客户端发送请求时,请求先到达反向代理服务器,然后再由反向代理服务器将请求转发到目标服务器...配置说明 要想配置反向代理,首先要掌握基本配置规范,基本反向代理配置很简单,但是如果要仔细配置也可以做到很复杂。官网给出反向代理最简单代码例子。...上述配置意思增加一个 proxy_add_x_forwarded_for 到 X-Forwarded-For 里去,注意增加,不是覆盖。...X-Real-IP,在NginxBackend输出http_x_real_ip获取到了真实客户端IPNginx Backendremote_addr”输出为最后一个反向代理IP;2....“proxy_set_headerX-Forwarded-For proxy_add_x_forwarded_for”把请求头中X-Forwarded-For与remote_addr用逗号合起来,

    98021

    php获取客户端IP服务器IP

    但如果客户端使用代理服务器来访问,那取到代理服务器 IP 地址,不是真正客户端 IP 地址。...但只有客户端使用“透明代理”情况下,$_SERVER[“HTTP_X_FORWARDED_FOR”] 值才是客户端真正IP(如果多层代理,该值可能由客户端真正IP和多个代理服务器IP组成,由逗号...REMOTE_ADDR 客户端跟你服务器“握手”时候IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器IP。...HTTP_CLIENT_IP 代理服务器发送HTTP头。如果“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器IP。..._SERVER[‘REMOTE_ADDR’]; //访问端IP(有可能用户,有可能代理服务器,也有可能反向代理服务器) _SERVER[‘HTTP_CLIENT_IP’]; //代理端(有可能存在

    4.7K30

    老大说,网上这种获取真实IP地址方法不对,我不信

    剩下部分在这里: #Nginx 设置 location ~ ^/static { proxy_pass ....; proxy_set_header X-Forward-For $remote_addr...; } 这段配置在前端Nginx反向代理上(其他反向代理请自行搜索),这段配置 作事情将X-Forward-For替换为remote_addr,再将X-Forward-For在内网 各服务器间安全传输...这里我再针对TCP/IP多做一些解释,众所周知TCP/IP建立连接时需要三次握手,并且,只有知道了client端请求IP地址,server数据才能返回给client,所以client想要获取到数据就必须提供真实...IP(DDOS攻击除外),request.getRemoteAddr()获取就是用户最真实IP。...,而用户对代理服务器发起HTTP请求,代理服务器对服务集群中真实部署对应服务进行“二次请求”,所以最终获取IP代理服务器在内网中ip地址,如192.168.xx.xx/10.xx.xx.xx

    1.6K20

    通过PHP实现获取访问用户IP

    在php中自带了一个非常简单获取IP地址全局变量,很多初学都获取IP都使用它了,但是对于这些我们一般用法满足了,但是对于要求高精度这个函数还是不行。...这个最简单方法,对于开了透明代理之类没有办法,如果内网访问也不能读取正确外网IP,不过很省力就是了: ip = _SERVER["REMOTE_ADDR"]; 搞定~ 上面方法用来取得客户端...IP 地址,但如果客户端使用代理服务器来访问,那取到就是代理服务器 IP 地址,不是真正客户端 IP 地址 要想透过代理服务器取得客户端真实 IP 地址,就要使用 getenv(“HTTP_X_FORWARDED_FOR...这种情况下已经确认客户端没有使用代理服务器,从而通过 else if(getenv(“REMOTE_ADDR”)) $ip = getenv(“REMOTE_ADDR”); 这两行语句获得客户端..."); } else { $realip = getenv("REMOTE_ADDR"); } } return $realip; } 另外如果我们想获取更精准使用第三方一个不错方法哦

    5.3K21

    3分钟短文 | PHP 获取精准 IP ,你拿到没准都是假

    如何获取精准 IP 地址呢?本文就为大家提供方法。 ? 学习时间 你是否正在使用 $ _SERVER ['REMOTE_ADDR'] 在PHP中查找客户端IP地址?...如果客户端通过代理服务器连接到Internet,则 PHP 中 $ _SERVER ['REMOTE_ADDR'] 只会返回代理服务器IP地址,不是客户端计算机IP地址。...扩展知识 无论什么时候,我们都不应该相信客户端发送来数据。当然也不能相信 $_SERVER['REMOTE_ADDR'] 包含连接方真实IP地址。...它们可能位于代理服务器之后,在这种情况下,且已设置了$_SERVER['HTTP_X_FORWARDED_FOR']。例如IP可以是来自代理后面的LAN内部IP。...如果作为整型存储,仅需要 4 bytes。 下面官方贴一个示例: ?

    85720

    php获取客户端真实IP 防止代理和作弊

    内容提要:这种情况下同样透露了客户端使用了代理服务器,但编造了一个虚假随机IP(220.4.251.159)代替客户端真实IP来欺骗它……   获取客户端ip其实不是个简单活儿,因为存在Ip欺骗...IP (经过多个代理服务器时,这个值类似:203.98.182.163, 203.98.182.163, 203.129.72.215) 这种情况下隐藏了客户端真实IP,但是向访问对象透露了客户端使用代理服务器访问它们...四、使用欺骗性代理服务器情况:Distorting Proxies REMOTE_ADDR = 代理服务器 IP HTTP_X_FORWARDED_FOR = 随机 IP(经过多个代理服务器时,...= 没数值或不显示 无论REMOTE_ADDR还是HTTP_FORWARDED_FOR,这些头消息未必能够取得到,因为不同浏览器不同网络设备可能发送不同IP头消息.因此PHP使用$_SERVER...["REMOTE_ADDR"] 、$_SERVER["HTTP_X_FORWARDED_FOR"] 获取值可能空值也可能“unknown”值.

    2.5K10

    Nginx配置文件nginx.conf全解

    remote_add拿到IP地址反向代理服务器iP地址。...# 反向代理服务器(nginx)在转发请求http头信息中,可以增加$http_x_forwarded_for信息,记录原有客户端IP地址和原来客户端请求服务器地址。...(来自被代理服务器--如tomcat)缓冲区数目和大小,默认情况也为分页大小,根据操作系统不同可能4k或者8k #proxy_buffers 4 256k; # 同一时间处理请求...server 192.168.75.132:8080 weight=1; # } # #【3】ip_hash:这种配置会使得每个请求按访问者iphash结果分配,这样每个访客固定访问一个后端服务器...# 以上三行,目的将代理服务器收到用户信息传到真实服务器上 # } # # # # location /face { #

    63112

    nginx proxy_set_header设置、自定义header

    ,通过$remote_addr变量拿到将是反向代理服务器ip地址”。...这句话意思说,当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()(本质上就是获取$remote_addr),取得nginx地址,即$remote_addr...X-real-ip $remote_addr; 这句话之前已经解释过,有了这句就可以在web服务器端获得用户真实ip 但是,实际上要获得用户真实ip不是只有这一个方法,下面我们继续看。...到X-Forwarded-For里去,注意增加,不是覆盖,当然由于默认X-Forwarded-For值,所以我们总感觉X-Forwarded-For值就等于$proxy_add_x_forwarded_for...变量"X-Forwarded-For"部分,所以只有$remote_addr$remote_addr用户ip,于是赋值以后,X-Forwarded-For变量值就是用户真实ip

    17.1K20

    Nginx通过二级目录(路径)映射不同反向代理,规避IP+端口访问

    APP 在获取数据时,会先通过域名向服务器发起一个简单校验请求,如果得到不是预期数据,说明该网络环境下 DNS 已被污染,比如被运营商劫持,请求 A 内容却给你展示 B 内容!...这时候,APP 将会启动备用预案,通过 IP 方式来请求数据!很明显,这个做法可以有效避免恶心 DNS 劫持了(看完这段是不是有所收获呢?)。...当开发 GG 找到我,提出需求是: 需要实现公网 IP+端口来访问,比如邮件 API 使用 http://192.168.1.10:125 Ps:公网服务器多线,那么就有多个 IP,本文假设电信...:你要通过 IP 请求邮件 API,只要请求 http://192.168.1.1/mail_api/ 即可,不需要开放多余端口。...我之前供职公司节点用 IIS 服务器,前端用 Nginx 反向代理,IIS 服务器上有多个站点,站点之间部分会通过 rewrite 规则联系起来。

    20.7K80

    【Nginx】面试官问我Nginx如何配置WebSocket?我给他现场演示了一番!!

    '' close; } upstream wsbackend{ server ip1:port1; server ip2:port2; keepalive 1000...其次: upstream wsbackend{ server ip1:port1; server ip2:port2; keepalive 1000; } 表示...nginx负载均衡: 两台服务器 (ip1:port1)和(ip2:port2) 。...keepalive 1000 表示每个nginx进程中上游服务器保持空闲连接,当空闲连接过多时,会关闭最少使用空闲连接.当然,这不是限制连接总数,可以想象成空闲连接池大小,设置值应该是上游服务器能够承受...,表示当前请求头,proxy_set_header表示设置请求头 proxy_set_header X-Real-IP $remote_addr; 表示传递时来源ip还是现在客户端ip proxy_read_timeout

    99320
    领券