0

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

2 回答 2

1

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

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

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

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

if ($ip=='') $ip = $_SERVER['REMOTE_ADDR'];
于 2018-09-26T03:26:01.933 回答
0

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

但他们通过Cloudflare 生成CF-Connecting-IP的标头和其他有用的标头报告真实 IP,以找出用户的真实来源。

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

于 2018-09-17T02:54:07.153 回答