Intereting Posts
В то время как / foreach Loops возвращают четыре из той же строки Изменить формат даты на голландский язык Запускать страницу PHP каждый час автоматически – без использования заданий Cron Как получить путь к серверу в веб-каталоге Symfony2 изнутри контроллера? получить startdate и enddate для текущего квартала php Есть ли ограничение памяти для метода json_encode ()? Когда filter_input () удаляет слэши переменных POST? Проверьте, была ли еще вызвана функция PHP – много переменных или один массив? PHP Замечание: преобразование массива в строку только на PHP 7 Автоматический вход в систему после регистрации в Silex Regex соответствует только определенным символам, которым предшествует пробел или ничего (начало строки) phpseclib – попытка подключения к коммутатору HP procurve возвращает ошибку: выполнение команды SSH не поддерживается PHP: Можно ли ссылаться на один элемент массива, который возвращается функцией? Есть ли проблемы с использованием ключевого слова static в простой PHP-функции?

CloudFlare и протоколирование посетителей IP-адресов через PHP

Я пытаюсь отслеживать и регистрировать пользователей / посетителей, которые обращаются к моему сайту, используя 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"] содержит действительный действительный 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 »

Облако Cloudflare хранятся публично, поэтому вы можете просмотреть их здесь, а затем проверить, является ли ip облачным (это позволит нам получить реальный 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 "Cloudflare :D<br>"; else echo "Not cloudflare o_0"; echo "Your actual ip address is: ". $ip; 

Этот скрипт покажет вам реальный IP-адрес и если запрос CF или нет!

Для пользователей 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

HTTP_CF_CONNECTING_IP работает только в том случае, если вы используете cloudflare, возможно, вы переносите свой сайт или удаляете cloudflare, вы забудете значение, поэтому используйте этот код.

 $ip=$_SERVER["HTTP_CF_CONNECTING_IP"]; if (!isset($ip)) { $ip = $_SERVER['REMOTE_ADDR']; } 

Когда вы используете CloudFlare, все ваши запросы между вашим сервером и пользователями маршрутизируются через серверы CloudFlare.

В этом случае существует два способа получить реальный IP-адрес пользователя:

  1. Через дополнительные серверные заголовки, добавленные серверами CloudFlare
  2. Добавление модуля 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 на вашем сервере

  • Установка модуля CloudFlare на сервере Apache
  • Установка модуля CloudFlare на сервере NGINX
  • Установка модуля CloudFlare на EasyApache + CPanel