PrettyPrint

piatok 12. júla 2013

Geolokácia pomocou GeoIP

Globalita Internetu so sebou prináša návštevníkov potenciálne z celého sveta. A či už ide o lokálnejšie alebo globálnejšie zameraný web, informácia o tom, odkiaľ návštevníci prichádzajú, sa môže hodiť. Napríklad, pokiaľ vieme, že návštevník webu prichádza z Českej republiky, môžeme mu poskytnúť údaje a informácie, ktoré sú preňho relevantnejšie – môže ísť napríklad o kontakty alebo aktuality. Tiež môžeme určité informácie sprístupniť alebo naopak zneprístupniť návštevníkom z určitého štátu. Ďalšou možnosťou, ako využiť znalosť takejto lokalizácie, je získanie prehľadu o tom, odkiaľ najčastejšie pochádzajú prístupy a na základe toho môžeme prípadne upraviť a optimalizovať obsah webu.

Spôsob získavania týchto informácií sa nazýva geolokácia. Na tieto účely je, de facto, najpoužívanejším systémom GeoIP od spoločnosti MaxMind. Jadrom GeoIP je obyčajná databáza obsahujúca informácie o tom, v ktorom štáte sa nachádzajú jednotlivé rozsahy IP adries. Možnosť používania geolokácie je podporovaná v mnohých programovacích jazykoch avšak v tomto príspevku sa zameriame na jej použitie na webových stránkach písaných v PHP a postavených na web serveri Apache.

Ako vlastne funguje geolokácia v spojení s Apache? Funkcionalitu sprístupňuje Apache modul s názvom mod_geoip2, ktorý umožňuje u prichádzajúcich požiadaviek na stránky zistiť na základe návštevníkovej IP adresy jeho štát, či mesto a podľa toho nastaviť premenné prostredia (na Elbia Hostingu je zatiaľ dostupné iba zisťovanie štátu). Tieto premenné prostredia sú potom štandardným spôsobom dostupné napríklad v PHP skripte alebo v .htaccess súboroch a na základe nich je možné rozhodovať sa, čo alebo ako zobraziť.

 

Použitie geolokácie

Ukážme si jednoduchý príklad, akým môžete na Elbia Hostingu sprístupniť tieto informácie. Vytvoríme si PHP skript, ktorý bude obsahovať tento fragment kódu:

<?php
$country = getenv('GEOIP_COUNTRY_NAME');

if ($country == "A1") {
    echo "Momentálne pristupujete s využitím anonymného proxy.\n";
} else {
    echo "Momentálne pristupujete zo štátu $country.\n";
}
?>
Ako vidieť už z príkladu, zaujímavosťou je, že v premennej GEOIP_COUNTRY_CODE môžeme nájsť aj kód A1, ktorý zodpovedá známym adresám anonymných proxy serverov. V tomto zozname nájdete prehľad všetkých možných kódov štátov a iných špeciálnych kódov, na ktoré môžete naraziť.

Takýmto spôsobom môžete použiť premenné uvedené nižšie (alebo premenné z úplného zoznamu):

  • GEOIP_CONTINENT_CODE – dvojpísmenový kód kontinentu (EU, AS, AF, NA, SA, OC)
  • GEOIP_COUNTRY_NAME – anglický názov štátu podľa ISO 3166
  • GEOIP_COUNTRY_CODE – dvojpísmenový kód štátu

Pokiaľ by ste chceli určitým návštevníkom celkovo zneprístupniť nejakú časť webu (neprístupné by boli všetky súbory, nielen PHP skripty), môžete využiť .htaccess súbor, ktorý cez FTP umiestnite do adresára, na ktorý sa má obmedzenie vzťahovať. Napríklad, ak by sme chceli zakázať prístup návštevníkom z Číny a Ruska, buď si vytvoríme nový .htaccess súbor alebo do existujúceho pridáme nasledovné direktívy:


<IfModule mod_geoip.c>
    SetEnvIf GEOIP_COUNTRY_CODE CN BlockCountry
    SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry
    Deny from env=BlockCountry
</IfModule>
V prípade pokusu o prístup zo zablokovaných lokácií sa návštevníkovi zobrazí chyba 403 Prístup zamietnutý.

O niečo komplikovanejší príklad je, keď by sme chceli na základe lokácie presmerovať návštevníka na jazykovo odlišné verzie súborov. Podobným spôsobom doplníme do .htaccess súboru nasledovné:

RewriteEngine On
RewriteBase /

# ak je GEOIP_COUNTRY_CODE nastavene na EN
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} EN
# a pristupuje sa k htm alebo txt strankam
RewriteCond %{REQUEST_URI} .(htm|txt)$
# pridame prefix /en/
RewriteRule ^(.*)$ /en/$0 [L]

# obdobne pre CZ
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} CZ
RewriteCond %{REQUEST_URI} .(htm|txt)$
RewriteRule ^(.*)$ /cz/$0 [L]

Záver

Na záver ešte pár poznámok k používaniu a možnostiam tejto realizácie geolokácie. Takto popísaným spôsobom je možné získať iba informácie o IP adrese, z ktorej príde požiadavka – nie je teda možné zisťovať, napríklad, štát ľubovoľne zvolenej IP adresy. Pokiaľ ide o postupne sa rozširujúce IPv6, pozitívnou správou je, že modul mod_geoip2 podporuje zisťovanie štátu na základe IPv6 adresy, čo môžete využiť aj v našom hostingu. Tiež je ešte potrebné dodať, že niekedy môžu byť takto získané geolokačné údaje nie úplne presné alebo aktuálne; hlavne pokiaľ sa snažíme zistiť polohu veľmi presne. Preto je vhodné používať ich skôr ako užitočné vodítko a nie ako zaručenú informáciu.