Alle indlæg af Søren Ulrikkeholm

Geo IP redirigering

GeoLite City er et praktisk lille Open Source-værktøj fra firmaet MaxMind, som kan være til stor hjælp ved IP redirigering. Applikationen består i al sin enkelthed af en database-fil, samt en række C# klasser, som bruges til at tilgå databasen. Databasen kan bruges til at finde oplysninger om bl.a. land, landekode, region, by, postnummer, længde- og breddegrader og meget andet for en given IP-adresse.

Det Open Source API fra MaxMind som vi har anvendt består af seks C# klasser, hvoraf kun to skal instantieres for at benytte applikationen til fulde (der er API til yderligere programmeringssprog også, se forrige link). Det drejer sig om klasserne: LookupService og Location.

LookupService instantieres med en sti til databasen, samt (optionelt) en int, der fortæller om databasen skal læses direkte fra filen, eller gemmes i en buffer. Som standard læses der direkte fra filen, men i hastighedskritiske sammenhænge, kunne man muligvis ønske at cache databasen. Dernæst bruges LookupService objektet til at instantiere Location.

Location instantieres ved at kalde getLocation() på LookupService med den ønskede IP-adresse som parameter. Når det er gjort, er man klar til at udnytte de mange muligheder GeoLite City tilbyder. Dette gøres i første omgang ved at tilgå de public attributter der ligger i Location.

Dette eksempel udskriver land og breddegrad for IP-adressen, 208.77.188.166:
Bemærk at der kastes en exception hvis IP’en ikke findes, og koden bør derfor sættes i en try-catch blok.

LookupService ls = new LookupService(@"C:\...\...\GeoLiteCity.dat", GEOIP_STANDARD);
Location l = ls.getLocation("208.77.188.166");
Console.WriteLine("Land: " + l.countryName);
Console.WriteLine("Breddegrad: " + l.longitude.ToString());

Oplysninger om land ville i praksis f.eks. kunne bruges til, at redirigere en hjemmesidebruger hen til en version af siden i det pågældende lands sprog.

Man kunne også forestille sig, at en hjemmeside ønskede at vise mindre ressourcekrævende udgaver af siden til langsomme forbindelser. Her ville man også kunne benytte sig af GeoLite City. I dette tilfælde kunne koden se nogenlunde sådan her ud:
Bemærk at man her benytter LookupService og ikke Location.

int i = ls.getID("208.77.188.166");
if (i == LookupService.GEOIP_UNKNOWN_SPEED)
{
   Response.Redirect("http://example.net/standard.asp");
}
else if (i == LookupService.GEOIP_CABLEDSL_SPEED)
{
   Response.Redirect("http://example.net/fast.asp");
}
else if(i == LookupService.GEOIP_DIALUP_SPEED)
{
   Response.Redirect("http://example.net/slow.asp");
}

Her er et eksempel på en lille webapplikation, der oplyser land, by og koordinater for angivne IP adresser. Eksemplet vælger som standard www.hinnerup.net serverens globale IP. Der kan indtastes såvel IPv4 som IPv6 adresser i IP-adressefeltet.

GeoLite City kan hentes her og opdateres en gang om måneden.