Я пытаюсь отслеживать и регистрировать пользователей / посетителей, которые обращаются к моему веб-сайту, используя для этого PHP $_SERVER['REMOTE_ADDR']
. Типичный метод отслеживания IP-адресов в PHP.
Однако я использую CloudFlare для кеширования и тому подобное и получаю их IP-адреса как CloudFlare:
108.162.212. * - 108.162.239. *
Каким будет правильный метод получения фактического IP-адреса пользователей / посетителей при использовании CloudFlare?
источник
Обновление : CloudFlare выпустила модуль
mod_cloudflare
для apache, модуль будет регистрировать и отображать фактические IP-адреса посетителей, а не те, к которым обращается cloudflare! https://www.cloudflare.com/resources-downloads#mod_cloudflare (ответ: olimortimer )Если у вас нет доступа к среде выполнения apache, вы можете использовать приведенный ниже сценарий, это позволит вам проверить, было ли соединение через cloudflare, и получить IP-адрес пользователя.
Я переписываю свой ответ, который использовал для другого вопроса « CloudFlare DNS / прямой IP-идентификатор »
IP-адреса Cloudflare хранятся в открытом доступе, поэтому вы можете просмотреть их здесь, а затем проверить, не принадлежит ли IP-адрес Cloudflare (это позволит нам получить реальный IP-адрес из заголовка http
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 "Connection is through cloudflare: <br>"; else echo "Connection is not through cloudflare: <br>"; echo "Your actual ip address is: ". $ip; echo "The server remote address header is: ". $_SERVER['REMOTE_ADDR'];
Этот скрипт покажет вам реальный IP-адрес и будет ли запрос CF или нет!
источник
Поскольку этот вопрос был задан и дан ответ, CloudFlare выпустила
mod_cloudflare
для Apache, который регистрирует и отображает фактический IP-адрес посетителя, а не адрес CloudFlare:https://www.cloudflare.com/resources-downloads#mod_cloudflare
источник
mod_cloudflare
, но его можно использовать. Называется что-то новоеmod_remoteip
. Ссылка: support.cloudflare.com/hc/en-us/articles/…mod_cloudflare
былCloudflare отправляет на ваш сервер некоторые дополнительные заголовки запросов, в том числе
CF-Connecting-IP
которые мы можем сохранить$user_ip
, если они определены, с помощью этого простого однострочного файла:$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
источник
Было бы сложно преобразовать 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']);
Узнать больше здесь
источник
HTTP_CF_CONNECTING_IP работает только в том случае, если вы используете cloudflare, возможно, вы переносите свой сайт или удаляете cloudflare, вы забудете значение, поэтому используйте этот код.
$ip=$_SERVER["HTTP_CF_CONNECTING_IP"]; if (!isset($ip)) { $ip = $_SERVER['REMOTE_ADDR']; }
источник
В Laravel добавьте следующую строку
AppServiceProvider
:... use Symfony\Component\HttpFoundation\Request; ... public function boot() { Request::setTrustedProxies(['REMOTE_ADDR'], Request::HEADER_X_FORWARDED_FOR); }
Теперь вы можете получить реальный IP клиента, используя
request()->ip()
.Подробнее читайте здесь .
источник
Для пользователей Magento 1.x (я еще не пробовал magento 2.0), проверьте https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the- right-way / для чего нужно изменить app / etc / local.xml и добавить: HTTP_CF_CONNECTING_IP
источник
Когда вы используете CloudFlare, все ваши запросы между вашим сервером и пользователями маршрутизируются через серверы CloudFlare.
В этом случае есть два способа получить настоящий IP-адрес пользователя:
Метод 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 на ваш сервер
источник