当我使用 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-IP
和other 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'];
我有一个测试 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-IP
和other 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'];