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

Cloudflare is giving me the wrong IP when I use getenv(REMOTE_ADDR)

我有一个测试 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);
?>

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

但他们通过headerCF-Connecting-IPother useful headers Cloudflare generate报告真实IP来找出用户的真实来源。

$_SERVER['HTTP_CF_CONNECTING_IP'] 代替 getenv(REMOTE_ADDR) 再试一次,看看会发生什么。

如果您使用的是 Nginx,您也可以在 PHP 参与之前在 Web 服务器级别更正此问题,在这种情况下 $ip = getenv(REMOTE_ADDR); 会给您 "real"访问者的IP。在 nginx 中,您可以在 nginx.conf 文件中为 Cloudflare 的每个 IP 范围使用 set_real_ip_from XXX 将 Cloudflare 的 IP 列入白名单。

没有我使用的网络服务器级别修复:

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

当我在网络服务器级别修复 IP 日志记录问题时,我使用了:

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