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.
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]
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