<< Back to main

Obtener la IP de un usuario con PHP

Ya sea por un blog en Wordpress o una app en la que solicita el cliente datos con respecto a la IP de los usuarios que visitan su sitio, será necesario obtenerla a través de un script de backend.

Para esta sencilla tarea se puede utilizar:

$_SERVER['REMOTE_ADDR'];

Y muy probablemente funcione. El problema es que actualmente por seguridad y desempeño, muchos servers utilizan proxys que regresan la dirección del proxy y no la del usuario que está intentando acceder al sitio. Por lo que si muchos usuarios entran a través del mismo proxy, esta es la única dirección que verás registrada en tu base de datos.

Para evitar esto se utiliza el header X-Forwarded-For, que es la dirección que el usuario manda al proxy para que este a la vez se dirija a nuestro sitio. Esto se logra a través del siguiente script:

function real_ip(){
	if ( function_exists( 'apache_request_headers' ) ) {
		$headers = apache_request_headers();
	} else {
		$headers = $_SERVER;
	}
	if ( array_key_exists( 'HTTP_CLIENT_IP', $headers ) && filter_var( $headers['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['HTTP_CLIENT_IP']; }
	elseif ( array_key_exists( 'X-Forwarded-For', $headers ) && filter_var( $headers['X-Forwarded-For'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['X-Forwarded-For']; }
	elseif ( array_key_exists( 'HTTP_X_FORWARDED_FOR', $headers ) && filter_var( $headers['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['HTTP_X_FORWARDED_FOR']; }
	elseif ( array_key_exists( 'HTTP_X_FORWARDED', $headers ) && filter_var( $headers['HTTP_X_FORWARDED'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['HTTP_X_FORWARDED']; }
	elseif ( array_key_exists( 'HTTP_FORWARDED_FOR', $headers ) && filter_var( $headers['HTTP_FORWARDED_FOR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['HTTP_FORWARDED_FOR']; }
	elseif ( array_key_exists( 'HTTP_FORWARDED', $headers ) && filter_var( $headers['HTTP_FORWARDED'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['HTTP_FORWARDED']; }
	elseif { array_key_exists( 'REMOTE_ADDR', $headers ) && filter_var( $headers['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 ) ) { $ip = $headers['REMOTE_ADDR']; }
	else { $ip = NULL }
	return $ip;
}