Geolocation enables developers to enhance the user experience. Content and advertising may be customized for a specific user's country, showing pages more relevant to the location of the user. Admins can further enhance a site's security by blocking a client based on country. Displays can be customized for the user's environment.
This wiki describes the new GeoLite2 database (with the .mmdb
extension), downloadable from here. To use the legacy databases (.dat
extension) see the description for setting up legacy databaseshere.
The GeoLite2 databases are updated frequently and will regularly have to be downloaded. The description of automating this download by MaxMind is here. It is strongly recommended that while you may want to test by downloading the databases manually that you have them updated automatically.
Full support for all of the databases (both the free ones and the subscription ones) are included. You need to download the databases to a known location on your system. The automatic update will load them into /usr/local/share/GeoIP
and the instructions will assume that you are loading the two free ones: GeoLite2-Country.mmdb
and GeoLite2-City.mmdb
and can be followed to setup access to the paid databases as well..
In OLS WebAdmin, configure the database location. Navigate to Configuration > Server > General > General settings > IP to GeoLocation DB Enter DB File Path:
/usr/local/share/GeoIP/GeoLite2-Country.mmdb
Set DB Name to: COUNTRY_DB
Similarly, add the city database by specifying DB File Path: /usr/local/share/GeoIP/GeoLite2-City.mmdb
and DB Name: to: CITY_DB
Navigate to Web Admin > Configurations > Your Virtual Hosts > Rewrite to add rewrite rules that will control the redirect:
<IfModule LiteSpeed> RewriteEngine on RewriteRule .* - [E=Cache-Control:vary=%{ENV:GEO_COUNTRY}] </IfModule>
Refer to Maxmind for more rewrite examples.
From This site, we can simply put in a web IP and choose a country from three(USA, Germany, Netherlands). If you want more than three countries, then you need to register for a paid plan.
You can choose a free proxy server from online free resources, e.g. Free_Proxy
Setup the proxy IP with your browser. Here are the steps for Chrome:
You can check source IP via LiteSpeed default php page http://yourdomain/index.php?act=phpinfo
. Check the $_SERVER
variables, and look for the ones which begin with GEOIP_
.
The environment variables are based on the default environment definitions. The advanced section below shows you how to customize them for your environment to allow you to specify environment names, display language, additional databases, etc.
A very useful MaxMind tool is downloaded and compiled with the source code release: mmdblookup
. Use this tool to view an entry in the database for a specific IP. For example, to see the country name definition for the IP address 47.22.54.182 enter from a command prompt in the openlitespeed directory:
libmaxminddb/bin/mmdblookup --file /usr/local/share/GeoIP/GeoLite2-Country.mmdb --ip 47.22.54.182 -v
The output is very detailed and can be informative as it shows you the information available in the database:
Database metadata Node count: 561374 Record size: 24 bits IP version: IPv6 Binary format: 2.0 Build epoch: 1530653013 (2018-07-03 21:23:33 UTC) Type: GeoLite2-Country Languages: de en es fr ja pt-BR ru zh-CN Description: en: GeoLite2 Country database { "continent": { "code": "NA" <utf8_string> "geoname_id": 6255149 <uint32> "names": { "de": "Nordamerika" <utf8_string> "en": "North America" <utf8_string> "es": "Norteamérica" <utf8_string> "fr": "Amérique du Nord" <utf8_string> "ja": "北アメリカ" <utf8_string> "pt-BR": "América do Norte" <utf8_string> "ru": "Северная Америка" <utf8_string> "zh-CN": "北美洲" <utf8_string> } } "country": { "geoname_id": 6252001 <uint32> "iso_code": "US" <utf8_string> "names": { "de": "USA" <utf8_string> "en": "United States" <utf8_string> "es": "Estados Unidos" <utf8_string> "fr": "États-Unis" <utf8_string> "ja": "アメリカ合衆国" <utf8_string> "pt-BR": "Estados Unidos" <utf8_string> "ru": "США" <utf8_string> "zh-CN": "美国" <utf8_string> } } "registered_country": { "geoname_id": 6252001 <uint32> "iso_code": "US" <utf8_string> "names": { "de": "USA" <utf8_string> "en": "United States" <utf8_string> "es": "Estados Unidos" <utf8_string> "fr": "États-Unis" <utf8_string> "ja": "アメリカ合衆国" <utf8_string> "pt-BR": "Estados Unidos" <utf8_string> "ru": "США" <utf8_string> "zh-CN": "美国" <utf8_string> } } }
In the example above you can see:
2018-07-03 21:23:33 UTC
GeoLite2-Country
de en es fr ja pt-BR ru zh-CN
country/names/es
is the Spanish language version of the United States and would be displayed as Estados Unidos
Note that this list is not the complete list of available options as it's only for the specific database, in this case the Country database. The City database has even more fields.
Navigate to Web Admin > Configurations > Your Virtual Hosts > Rewrite:
Yes
9
.# Redirect two specific countries RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(CA)$ RewriteRule ^(.*)$ https://en.wikipedia.org/wiki/Canada [R,L] RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(EU)$ RewriteRule ^(.*)$ https://en.wikipedia.org/wiki/Europe [R,L]
tail -f /PATH_TO_LSWS/log/error.log
When you are using a CA IP:
[REWRITE] Rule: Match '/' with pattern '^(.*)$', result: 2 [REWRITE] Cond: Match 'CA' with pattern '^(CA)$', result: 2 [REWRITE] Source URI: '/' => Result URI: 'https://en.wikipedia.org/wiki/Canada'
With a Germany IP:
[REWRITE] Rule: Match '/' with pattern '^(.*)$', result: 2 [REWRITE] Cond: Match 'EU' with pattern '^(EU)$', result: 2 [REWRITE] Source URI: '/' => Result URI: 'https://en.wikipedia.org/wiki/Europe'
Using a Netherlands IP:
[REWRITE] Rule: Match '/' with pattern '^(.*)$', result: 2 [REWRITE] Cond: Match 'NL' with pattern '^(CA)$', result: -1 [REWRITE] Rule: Match '/' with pattern '^(.*)$', result: 2 [REWRITE] Cond: Match 'NL' with pattern '^(EU)$', result: -1
2 is match, -1 is not match
nobody
) has read access to the GeoIP database file(s) you are using.10.0.0.0/8
, 172.16.0.0/12
or 192.168.0.0/16
. GeoIP can only look up public IP addresses.error.log
will show geolocation messages with a prefix of [GEO]
. Turning on Debug mode will provide quite a bit of details.
The full power of the GeoIP2 facility requires use of the environment variables in the Litespeed Configuration. The description of the format used is designed to be as similar as possible as the Apache mod_maxminddb
environment described here specifically for the MaxMindDBEnv
variable. Each environment variable is specified in the environment text box as one line:
GEOIP_COUNTRY_NAME
COUNTRY_DB
/
mmdblookup
. For example: country/names/en
Thus the default generates: GEOIP_COUNTRY_NAME COUNTRY_DB/country/names/en
If you wanted the country code to be displayed in Spanish, you would enter the environment variable: GEOIP_COUNTRY_NAME COUNTRY_DB/country/names/es
Note that if a variable is used by multiple databases (for example, the default GEOIP_COUNTRY_NAME
) you need to override the value in the last database specified (or all databases in case they get reordered, just to be safe). The default environment variables vary by database and are designed to be as similar to the legacy GeoIP environment variables as possible.
Database name: GeoLite2-Country.mmdb Logical name: COUNTRY_DB
Variable | Definition | Notes |
---|---|---|
GEOIP_CONTINENT_CODE | COUNTRY_DB/continent/code | 2 digit string ('NA' for North America) |
GEOIP_COUNTRY_CODE | COUNTRY_DB/country/iso_code | 2 digit string ('US' for United States) |
GEOIP_COUNTRY_CONTINENT | COUNTRY_DB/continent/code | Same as GEOIP_CONTINENT_CODE |
GEOIP_COUNTRY_NAME | COUNTRY_DB/country/names/en | Default is English, you may want to change this |
Database name: GeoLite2-City.mmdb Logical name: CITY_DB
Variable | Definition | Notes |
---|---|---|
GEOIP_CITY | CITY_DB/city/names/en | Nationalized, default is English, you may want to change this |
GEOIP_CONTINENT_CODE | CITY_DB/continent/code | 2 digit string ('NA' for North America) |
GEOIP_COUNTRY_CODE | CITY_DB/country/iso_code | 2 digit string ('US' for United States) |
GEOIP_COUNTRY_CONTINENT | CITY_DB/continent/code | Same as GEOIP_CONTINENT_CODE |
GEOIP_COUNTRY_NAME | CITY_DB/country/names/en | Nationalized, default is English, you may want to change this |
GEOIP_DMA_CODE | CITY_DB/location/metro_code | An integer number |
GEOIP_LATITUDE | CITY_DB/location/latitude | A signed floating point (double) |
GEOIP_LONGITUDE | CITY_DB/location/longitude | A signed floating point (double) |
GEOIP_METRO_CODE | CITY_DB/location/metro_code | An integer number |
GEOIP_POSTAL_CODE | CITY_DB/postal/code | Varies by country (ZIP code in U.S.) |
GEOIP_REGION | CITY_DB/subdivisions/iso_code | Varies by country (State in U.S.) |
GEOIP_REGION_NAME | CITY_DB/subdivisions/name/en | Nationalized, default is English, varies by country (State in U.S.) |
Database name: GeoLite2-ASN.mmdb Logical name: ASN_DB
Variable | Definition | Notes |
---|---|---|
GEOIP_ISP | ASN_DB/autonomous_system_number | A 32-bit integer |
GEOIP_ORGANIZATION | ASN_DB/autonomous_system_organization | A vendor specific string |