Geolocalización desde PHP y .htaccess, bloqueando el acceso por países

Recientemente hemos implementado a nivel servidor web la capacidad de localizar el país de un usuario en base a su IP, al obtener esta información a nivel servidor web, hace que esta se obtenga de forma rápida y segura y esté disponible tanto en el .htaccess como vía PHP.

Vía .htaccess

Tener esta información disponible para su uso en el .htaccess hace que podamos entre otras cosas hacer bloqueos selectivos por paises.

Las reglas se añadirán siempre al inicio del .htaccess y activaremos la geolocalización por medio de la directiva GeoIPEnable On que le dirá al servidor web que debe geolocalizar a cada visitante.

A continuación usaremos SetEnvIf GEOIP_COUNTRY_CODE CODIGO_PAIS DenyCountry para cada país que queramos bloquear, siendo CODIGO_PAIS el código ISO 3166-1 alfa-2 del país en cuestión, por ejemplo Rusia sería RU, puedes ver un listado completo de códigos por país aquí.

Finalmente terminamos con Allow from all para permitir el acceso al resto de paises y Deny from env=DenyCountry que simplemente define la directiva DenyCountry que estamos usando en líneas anteriores.

Un ejemplo completo en el que bloqueamos tres países:

GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE MX DenyCountry
SetEnvIf GEOIP_COUNTRY_CODE RU DenyCountry
SetEnvIf GEOIP_COUNTRY_CODE CH DenyCountry
Allow from all
Deny from env=DenyCountry

Lo mismo podríamos hacer a la inversa, permitir el acceso de varios países concretos y denegar el resto que no estén definidos como permitidos, por ejemplo permitimos España y Alemania y el resto los bloqueamos:

GeoIPEnable On
SetEnvIf GEOIP_COUNTRY_CODE ES AllowCountry
SetEnvIf GEOIP_COUNTRY_CODE DE AllowCountry
Deny from all
Allow from env=AllowCountry

E incluso si cambiamos GEOIP_COUNTRY_CODE por GEOIP_CONTINENT_CODE podemos definir el conteninente, permitiendo solo el acceso por ejemplo a Europa por medio del código EU.

También podría ser usado como mecanismo de seguridad, en este ejemplo solo permitimos el acceso a wp-admin, wp-login.php y fichero xmlrpc.php de Wordpress a usuarios localizados en España:

GeoIPEnable On
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} !^(ES)$
RewriteRule (wp-login|wp-admin|xmlrpc).php$ - [F,L]

Un planteamiento similar se podría usar no solo para bloquear o permitir, también para redireccionar, por ejemplo detectando usuarios de países específicos que deben ser redireccionados hacia una versión concreta de la web o app. En este ejemplo redireccionamos los visitantes desde Estados Unidos y Canada a otra url externa:

GeoIPEnable On
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(CA|US)$
RewriteRule ^(.*)$ http://www.otraweb.com$1 [R,L]

Usando la información vía PHP

Debes tener en cuenta que esta información solo estará disponible si activas la Geolocalización por medio del .htaccess, añadiendo justo al inicio la directiva:

GeoIPEnable On

Una vez añadido, tendrás la información de geolocalización en las variables de entorno para su uso:

<?php

$_SERVER['GEOIP_ADDR']; // dirección IP desde la que accede
$_SERVER['GEOIP_COUNTRY_CODE']; // Código del país, ej ES
$_SERVER['GEOIP_CONTINENT_CODE']; // Código del contienente, ej EU