Estoy tratando de rastrear y registrar a los usuarios / visitantes que acceden a mi sitio web usando PHP $_SERVER['REMOTE_ADDR']
para hacerlo. Un método típico para el seguimiento de direcciones IP en PHP.
Sin embargo, estoy usando CloudFlare para almacenar en caché y recibir sus direcciones IP como las de CloudFlare:
108.162.212. * - 108.162.239. *
¿Cuál sería un método correcto para recuperar la dirección IP de los usuarios / visitantes reales sin dejar de usar CloudFlare?
fuente
Actualización : CloudFlare ha lanzado un módulo
mod_cloudflare
para apache, el módulo registrará y mostrará las direcciones IP reales de los visitantes en lugar de las a las que accede cloudflare. https://www.cloudflare.com/resources-downloads#mod_cloudflare (Respuesta de: olimortimer )Si no tiene acceso al tiempo de ejecución de apache, puede usar el siguiente script, esto le permitirá verificar si la conexión fue a través de cloudflare y obtener la ip de los usuarios.
Estoy reescribiendo mi respuesta que usé para otra pregunta " Identificador de IP directo / DNS de CloudFlare "
Las ips de Cloudflare se almacenan en público para que pueda verlas aquí y luego verificar si la ip es de cloudflare (esto nos permitirá obtener la ip real del encabezado http
HTTP_CF_CONNECTING_IP
).Si está usando esto para deshabilitar todas las conexiones que no sean de cf o viceversa, le recomiendo que tenga un único archivo de script php que se llame antes que cualquier otro script, como common.php o pagestart.php, etc.
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']; } }
Usar el script es bastante simple:
$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'];
Este script le mostrará la dirección IP real y si la solicitud es CF o no.
fuente
Desde que se hizo y respondió esta pregunta, CloudFlare ha lanzado
mod_cloudflare
para Apache, que registra y muestra la dirección IP real del visitante en lugar de la dirección de CloudFlare:https://www.cloudflare.com/resources-downloads#mod_cloudflare
fuente
mod_cloudflare
, pero se pueden usar. Hay algo nuevo llamadomod_remoteip
. Referencia: support.cloudflare.com/hc/en-us/articles/…mod_cloudflare
fue de hace 4 añosCloudflare envía algunos encabezados de solicitud adicionales a su servidor, incluidos los
CF-Connecting-IP
que podemos almacenar$user_ip
, si se definen, utilizando este sencillo resumen:$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"])?$_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
fuente
Sería difícil convertir HTTP_CF_CONNECTING_IP a REMOTE_ADDR. Entonces puede usar apache (.htaccess) auto anteponiendo para hacer eso. Para que no tenga que pensar si
$_SERVER['REMOTE_ADDR']
tiene el valor correcto en todos los scripts PHP..htaccess código
php_value auto_prepend_file "/path/to/file.php"
código php (file.php)
<?php define('CLIENT_IP', isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : $_SERVER['REMOTE_ADDR']);
Más información aquí
fuente
HTTP_CF_CONNECTING_IP solo funciona si está usando cloudflare, tal vez transfiera su sitio o elimine cloudflare, olvidará el valor, así que use este código.
$ip=$_SERVER["HTTP_CF_CONNECTING_IP"]; if (!isset($ip)) { $ip = $_SERVER['REMOTE_ADDR']; }
fuente
Para usuarios de magento 1.x (todavía no he probado magento 2.0), consulte https://tall-paul.co.uk/2012/03/13/magento-show-remote-ip-in-cloudflare-the- de la manera correcta / que necesita cambiar la aplicación / etc / local.xml y agregar: HTTP_CF_CONNECTING_IP
fuente
Cuando usa CloudFlare, todas sus solicitudes entre su servidor y los usuarios se enrutan a través de los servidores de CloudFlare.
En este caso, existen dos métodos para obtener la dirección IP real del usuario:
Método 1: obtener IP a través de encabezados de servidor adicionales
Puede utilizar el siguiente código para obtener la dirección IP del usuario:
$user_ip = (isset($_SERVER["HTTP_CF_CONNECTING_IP"]) $_SERVER["HTTP_CF_CONNECTING_IP"]:$_SERVER['REMOTE_ADDR']);
¿Cómo está funcionando?
CloudFlare agrega algunas variables de servidor adicionales en la solicitud de la siguiente manera:
$_SERVER["HTTP_CF_CONNECTING_IP"]
- Dirección IP real del usuario$_SERVER["HTTP_CF_IPCOUNTRY"]
- País ISO2 del usuario$_SERVER["HTTP_CF_RAY"]
Una cadena especial para fines de registroEn el código anterior, estamos verificando si
$_SERVER["HTTP_CF_CONNECTING_IP"]
está configurado o no. Si está allí, consideraremos que como dirección IP del usuario, de lo contrario, usaremos el código predeterminado como$_SERVER['REMOTE_ADDR']
Método 2: Instalación del módulo Cloudflare en su servidor
fuente