Php 为什么$'U SERVER[“REMOTE”u ADDR";]显示的IP与我的外部IP不同?

Php 为什么$'U SERVER[“REMOTE”u ADDR";]显示的IP与我的外部IP不同?,php,apache,nginx,ip,Php,Apache,Nginx,Ip,可能重复: 我一定错过了一些基本的东西。。但是当我导航到一个显示IP的站点时,比如他们显示某个IP。但是当我在我的站点上的一个页面上回显$\u SERVER[“REMOTE\u ADDR”]时,它会显示一个不同的IP 为什么呢?我如何通过PHP获取whatsmyip.org网站显示的相同IP?这可能是因为您从localhost访问它?您看到的IP是127.0.0.1还是您的本地IP(192.168.x.x)?当您的web服务器位于本地计算机上时,它将为您提供本地IP地址,主要是127.0.0.

可能重复:

我一定错过了一些基本的东西。。但是当我导航到一个显示IP的站点时,比如他们显示某个IP。但是当我在我的站点上的一个页面上回显
$\u SERVER[“REMOTE\u ADDR”]
时,它会显示一个不同的IP


为什么呢?我如何通过PHP获取whatsmyip.org网站显示的相同IP?

这可能是因为您从localhost访问它?您看到的IP是127.0.0.1还是您的本地IP(192.168.x.x)?

当您的web服务器位于本地计算机上时,它将为您提供本地IP地址,主要是127.0.0.1,这是因为您不是从外部访问它。这就是原因。

如果您的计算机与服务器在同一个网络上,在一个带有NAT的路由器后面,那么您可能会看到您的专用IP

什么是IP


我唯一的想法是,你可以在一个代理的背后。是吗?

首先让我澄清几件事

当您的本地主机不使用ISP获取网页时,您将使用内部ip
127.0.0.1
::1
,用于ipv6

如果您通过某种路由器从本地网络获取页面,您将拥有由路由器分配的ip,如
192.168.1.90

如果您的站点托管在网络之外,那么您要求您的ISP为您获取站点,这意味着您可以使用whatsmyip指定的IP

如果您使用的是DNS服务器,如Opendns,那么您请求ISP请求Opendns为您获取站点,而Opendns使用了一组与您不同的ip,原因显而易见

可能存在某种可能会干扰的代理,因此您应该做的是针对这种情况,一个标准代理站点应该将客户端IP转发到服务器上,以防需要任何直接连接以及其他一些原因

也就是说,在检查
REMOTE\u ADDR
之前,您通常可以通过检查其他几个参数来找到IP,下面是我为我的一个项目创建的一个类,但您可以只获取所需的:

正如您所见,数组的顺序非常重要:

  • HTTP_客户端_IP
  • HTTP\u X\u转发\u用于
  • HTTP_X_转发
  • HTTP_X_群集_客户端_IP
  • HTTP\u转发\u用于
  • HTTP_转发
  • 远程地址

请注意,
REMOTE\u ADDR
排在最后,这是因为这是最后的手段,大多数情况下是不正确的。

如果您的服务器是Apache,并且在Apache之前使用了一些前端,您可以尝试使用mod\u rpaf
在Debian中:
智能安装libapache2 mod rpaf

然后编辑配置:
nano/etc/apache2/mods enabled/rpaf.conf

<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
</IfModule>

RPAFON启用
RPAFsethostname关闭
RPAFproxy_ips 127.0.0.1

您的服务器是什么?你到底看到哪个IP?可能是127.0.0.1或192.168.0.1或类似的东西。您的PHP服务器是否运行在具有重写/代理配置的Apache前端后面?@OZ_uuu我看到的ip不是127.0.0.1或192.168.0.1,它是“正常”ip。没错,测试它是否“正确”whatsmyip站点的IP是213.115.255.236,我自己通过回显得到的IP是194.192.151.254,但我的Web服务器不在本地机器上。whatsmyip站点的“正确”IP是213.115.255.236,我自己通过回显得到的IP是194.192.151.254,然后可能在您的局域网中……首先检查远程地址是否是专用地址可能是合适的;其他值可能在标头中被欺骗。
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1
</IfModule>