当我使用getenv(REMOTE_ADDR)时,Cloudflare给我错误的IP

时间:2018-09-17 02:47:42

标签: php cloudflare getenv

我有一个测试php代码。这实际上是获取某人的IP并将其通过电子邮件发送到一个地址。我计划稍后将其存储在数据库中,但出于测试目的,我将其作为电子邮件发送给我。

我的问题是,我启用了cloudflare,因此当我使用getenv(REMOTE_ADDR)时,它会提供cloudflare的IP,而不是实际的访问者IP。有什么办法可以获取访问者的IP?

<?php
$ip = getenv(REMOTE_ADDR);
mail("email@domain.com", "You got a visitor", "IP: ".$ip);
?>

2 个答案:

答案 0 :(得分:0)

当然是这样,Cloudflare通过中介连接(反向代理)向用户隐藏了服务器的真实地址,并且以相同的速度,您看到代理的IP访问页面而不是用户的IP。

但是他们通过标头ggplotother useful headers Cloudflare generate报告真实IP,以找出用户的真实来源。

使用CF-Connecting-IP而不是$_SERVER['HTTP_CF_CONNECTING_IP']再试一次,看看会发生什么。

答案 1 :(得分:0)

如果您使用的是Nginx,还可以在PHP参与之前在Web服务器级别进行更正,在这种情况下,$ip = getenv(REMOTE_ADDR);将为您提供访问者的“真实” IP。在nginx中,您需要为每个Cloudflare的IP范围使用set_real_ip_from XXX在nginx.conf文件中将Cloudflare的IP白名单。

我没有使用网络服务器级别的修补程序:

if ($ip=='') $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];

在Web服务器级别解决IP日志记录问题后,我使用了:

if ($ip=='') $ip = $_SERVER['REMOTE_ADDR'];