CloudFlare и регистрация IP-адресов посетителей через PHP
Я пытаюсь отслеживать и регистрировать пользователей / посетителей, которые обращаются к моему сайту с помощью PHP $_SERVER['REMOTE_ADDR'] чтобы сделать так. Типичный метод отслеживания IP-адресов в PHP.
тем не менее, я использую CloudFlare для кэширования и таких и получения их IP-адресов, как CloudFlare:
108.162.212.* - 108.162.239.*
каков был бы правильный метод получения фактического IP-адреса пользователей / посетителей при использовании CloudFlare?
8 ответов:
дополнительные переменные сервера, доступные для cloud flare:
$_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"]содержит фактический действительный IP-адрес cloudflare, потому что любой может подделать заголовок, если он смог подключиться непосредственно к 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 / direct IP identifier"
ips Cloudflare хранятся в общественных местах, так что вы можете пойти посмотреть их здесь затем проверьте, является ли ip от cloudflare (это позволит нам получить реальный ip из заголовка http
HTTP_CF_CONNECTING_IP).Если вы используете это, чтобы отключить все соединения без cf или наоборот, я рекомендую вам иметь один файл php-скрипта, который вызывается перед каждым другие сценарии, такие как общий.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 (.реврайт) автоматического добавления, чтобы сделать это. Так что вам не нужно думать о том,
$_SERVER['REMOTE_ADDR']имеет правильное значение во всех PHP-скриптов..реврайт код
php_value auto_prepend_file "/path/to/file.php"PHP-код (файл.php)
<?php define('CLIENT_IP', isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_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-right-way/ который должен изменить приложение / etc / local.XML и добавить: HTTP_CF_CONNECTING_IP
HTTP_CF_CONNECTING_IP работает только если вы используете cloudflare возможно, вы перенесете свой сайт или удалите cloudflare вы забудете значение, поэтому используйте этот код .
$ip=$_SERVER["HTTP_CF_CONNECTING_IP"]; if (!isset($ip)) { $ip = $_SERVER['REMOTE_ADDR']; }
при использовании CloudFlare все ваши запросы между сервером и пользователями направляются через серверы CloudFlare.
в этом случае есть два способа получить реальный IP-адрес пользователя:
- через дополнительные заголовки сервера, добавленные серверами CloudFlare
- добавление модуля CloudFlare Apache/NGINX на вашем сервере.
метод 1: получить 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']Способ 2: установка модуля Cloudflare на вашем сервере
Comments