我试图跟踪和记录用户/观众正在访问使用PHP的我的网站, $_SERVER['REMOTE_ADDR']
这样做。 对于IP地址的PHP跟踪的典型方法。
但是,我使用了缓存和这样的CloudFlare和接受他们的IP地址作为CloudFlare的:
108.162.212。* - 。108.162.239 *
什么是检索实际用户/访问者IP地址,而仍然使用的CloudFlare的正确方法是什么?
我试图跟踪和记录用户/观众正在访问使用PHP的我的网站, $_SERVER['REMOTE_ADDR']
这样做。 对于IP地址的PHP跟踪的典型方法。
但是,我使用了缓存和这样的CloudFlare和接受他们的IP地址作为CloudFlare的:
108.162.212。* - 。108.162.239 *
什么是检索实际用户/访问者IP地址,而仍然使用的CloudFlare的正确方法是什么?
额外的服务器变量可用云耀斑是:
$_SERVER["HTTP_CF_CONNECTING_IP"]
真正的访问者的IP地址,这是你想要的
$_SERVER["HTTP_CF_IPCOUNTRY"]
游客的国家
$_SERVER["HTTP_CF_RAY"]
参见描述在这里
$_SERVER["HTTP_CF_VISITOR"]
这可以帮助你知道,如果它的HTTP或HTTPS
你可以使用它像这样:
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
如果你这样做,和来访的IP地址的有效性是非常重要的,你可能需要验证$_SERVER["REMOTE_ADDR"]
包含一个实际有效的CloudFlare的IP地址,因为任何人都可以伪造的头,如果他能够连接直接到服务器IP。
由于这个问题被提出和回答,CloudFlare的发布mod_cloudflare
为Apache,它记录和显示实际访问者的IP地址,而不是CloudFlare的地址:
https://www.cloudflare.com/resources-downloads#mod_cloudflare
CloudFlare的发送一些额外的请求头到您的服务器,包括CF-Connecting-IP
,我们可以存入$user_ip
,如果定义,使用这种简单的一行:
$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
我重写我的答案我用另外一个问题“ 的CloudFlare DNS / IP直接标识 ”
CloudFlare的IPS存储在公共所以你可以去查看他们在这里然后检查IP是从CloudFlare的(这将使我们能够获得来自HTTP标头的真实IP HTTP_CF_CONNECTING_IP
)。
如果你正使用该禁用所有非CF连接或反之亦然,我建议你有一个被所有其他脚本之前称为单一的PHP脚本文件如的common.php或pagestart.php等。
function ip_in_range($ip, $range) {
if (strpos($range, '/') == false)
$range .= '/32';
// $range is in IP/CIDR format eg 127.0.0.1/24
list($range, $netmask) = explode('/', $range, 2);
$range_decimal = ip2long($range);
$ip_decimal = ip2long($ip);
$wildcard_decimal = pow(2, (32 - $netmask)) - 1;
$netmask_decimal = ~ $wildcard_decimal;
return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}
function _cloudflare_CheckIP($ip) {
$cf_ips = array(
'199.27.128.0/21',
'173.245.48.0/20',
'103.21.244.0/22',
'103.22.200.0/22',
'103.31.4.0/22',
'141.101.64.0/18',
'108.162.192.0/18',
'190.93.240.0/20',
'188.114.96.0/20',
'197.234.240.0/22',
'198.41.128.0/17',
'162.158.0.0/15',
'104.16.0.0/12',
);
$is_cf_ip = false;
foreach ($cf_ips as $cf_ip) {
if (ip_in_range($ip, $cf_ip)) {
$is_cf_ip = true;
break;
}
} return $is_cf_ip;
}
function _cloudflare_Requests_Check() {
$flag = true;
if(!isset($_SERVER['HTTP_CF_CONNECTING_IP'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_IPCOUNTRY'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_RAY'])) $flag = false;
if(!isset($_SERVER['HTTP_CF_VISITOR'])) $flag = false;
return $flag;
}
function isCloudflare() {
$ipCheck = _cloudflare_CheckIP($_SERVER['REMOTE_ADDR']);
$requestCheck = _cloudflare_Requests_Check();
return ($ipCheck && $requestCheck);
}
// Use when handling ip's
function getRequestIP() {
$check = isCloudflare();
if($check) {
return $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
return $_SERVER['REMOTE_ADDR'];
}
}
要使用它很简单的脚本:
$ip = getRequestIP();
$cf = isCloudflare();
if($cf) echo "Cloudflare :D<br>";
else echo "Not cloudflare o_0";
echo "Your actual ip address is: ". $ip;
这个脚本会告诉你真实的IP地址,如果该请求是CF还是不行!
这将是很难HTTP_CF_CONNECTING_IP转换为REMOTE_ADDR。 所以,你可以使用Apache(.htaccess)是否自动预先考虑这样做。 所以,你不必去想是否$_SERVER['REMOTE_ADDR']
在所有的PHP脚本正确的值。
的.htaccess代码
php_value auto_prepend_file "/path/to/file.php"
PHP代码(file.php)
<?php
define('CLIENT_IP', isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']);
了解更多点击这里
如果你正在使用的CloudFlare也许你将您的网站或删除的CloudFlare你会忘记值,以便使用此代码HTTP_CF_CONNECTING_IP只工作。
$ip=$_SERVER["HTTP_CF_CONNECTING_IP"];
if (!isset($ip)) {
$ip = $_SERVER['REMOTE_ADDR'];
}
对于Magento的1.x的用户(我还没有尝试的Magento 2.0还),检查https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the-正确的路/它需要改变应用程序的/ etc / local.xml中并添加:HTTP_CF_CONNECTING_IP
当您使用的CloudFlare的服务器和用户之间的所有请求都通过CloudFlare的服务器路由。
在这种情况下,有两种方法来获取用户的真实IP地址:
您可以使用下面的代码来获得用户的IP地址:
$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"]) $_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
CloudFlare的增加了一些额外的服务器变量的要求如下:
$_SERVER["HTTP_CF_CONNECTING_IP"]
-用户的真实IP地址
$_SERVER["HTTP_CF_IPCOUNTRY"]
- ISO2用户的国家
$_SERVER["HTTP_CF_RAY"]
特殊字符串为宗旨洛
在上面的代码中,如果我们正在检查$_SERVER["HTTP_CF_CONNECTING_IP"]
设置与否。 如果它的存在,我们将考虑其他如用户的IP地址,我们将使用默认的代码$_SERVER['REMOTE_ADDR']