Apache2 – Using mod_rewrite and RewriteMap with a Python program to georedirect
Friday, August 2nd, 2013Almost every machine we run has geoip loaded and clients are able to access the country code of a surfer without having to write too much code. One client decided that they wanted to redirect users from certain states to another page to deal with sales tax and shipping issues but had a mixture of perl scripts and php scripts running their shopping cart.
Having done something very similar using mod_rewrite and rewritemap with a text file, the simple solution appeared to be a short Python script to interface with the GeoIPLite data and use mod_rewrite.
In our VirtualHost config, we put:
RewriteMap statecode prg:/var/www/rewritemap/tools/rewritemap.py
To set up our Python environment, we did:
virtualenv /var/www/rewritemap cd /var/www/rewritemap source bin/activate git clone https://github.com/maxmind/geoip-api-python.git cd geoip-api-python python setup.py install cd .. mkdir tools cd tools wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz gunzip GeoLiteCity.dat.gz
rewritemap.py
#!/var/www/rewritemap/bin/python import sys import GeoIP gi = GeoIP.open("/var/www/rewritemap/tools/GeoLiteCity.dat", \ GeoIP.GEOIP_STANDARD) STATE = 'NULL' gir = gi.record_by_name(sys.stdin.readline()) if gir != None: if gir['country_code'] == 'US': STATE = gir['region'] print STATE
Then, in our .htaccess we put:
RewriteEngine on RewriteCond ${statecode:%{REMOTE_ADDR}|NONE} ^(PA|DC|CO)$ RewriteRule .* /specialpage/ [R=302,L]