我有一个测试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);
?>
答案 0 :(得分:0)
当然是这样,Cloudflare通过中介连接(反向代理)向用户隐藏了服务器的真实地址,并且以相同的速度,您看到代理的IP访问页面而不是用户的IP。
但是他们通过标头ggplot
和other 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'];