How would I detect all European countries with CloudFlare geolocation

11,594

The value of $_SERVER["HTTP_CF_IPCOUNTRY"] is a country code. So first you will need a list of all the European country codes.

$europe = array('AD', 'AL', 'AT', 'AX', 'BA', 'BE', 'BG', 'BY', 'CH', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FO', 'FR', 'GB', 'GG', 'GI', 'GR', 'HR', 'HU', 'IE', 'IM', 'IS', 'IT', 'JE', 'LI', 'LT', 'LU', 'LV', 'MC', 'MD', 'ME', 'MK', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'RS', 'RU', 'SE', 'SI', 'SJ', 'SK', 'SM', 'UA', 'VA');

You can then use this list to validate the request:

if(in_array($country_code, $europe)) {
  // Europe
} else {
  // Not Europe
}

If you want to target specific regions, you can use these lists:

$eastern = array('BG', 'BY', 'CZ', 'HU', 'MD', 'PL', 'RO', 'RU', 'SK', 'UA');
$northern = array('AX', 'DK', 'EE', 'FI', 'FO', 'GB', 'GG', 'IE', 'IM', 'IS', 'JE', 'LT', 'LV', 'NO', 'SE', 'SJ');
$southern = array('AD', 'AL', 'BA', 'ES', 'GI', 'GR', 'HR', 'IT', 'ME', 'MK', 'MT', 'PT', 'RS', 'SI', 'SM', 'VA');
$western = array('AT', 'BE', 'CH', 'DE', 'FR', 'LI', 'LU', 'MC', 'NL');

For example:

if(in_array($country_code, $eastern)) {
  // Eastern Europe
} else {
  // Not Eastern Europe
}

I contacted CloudFlare to make sure the list of country codes are valid. They sent me a list of possible values for $_SERVER["HTTP_CF_IPCOUNTRY"]. I validated the above arrays, all country codes in those arrays are in the list of possible values.

For reference, here is the list of possible values:

A1  Anonymous Proxy
A2  Satellite Provider
O1  Other Country
AD  Andorra
AE  United Arab Emirates
AF  Afghanistan
AG  Antigua and Barbuda
AI  Anguilla
AL  Albania
AM  Armenia
AO  Angola
AP  Asia/Pacific Region
AQ  Antarctica
AR  Argentina
AS  American Samoa
AT  Austria
AU  Australia
AW  Aruba
AX  Aland Islands
AZ  Azerbaijan
BA  Bosnia and Herzegovina
BB  Barbados
BD  Bangladesh
BE  Belgium
BF  Burkina Faso
BG  Bulgaria
BH  Bahrain
BI  Burundi
BJ  Benin
BL  Saint Bartelemey
BM  Bermuda
BN  Brunei Darussalam
BO  Bolivia
BQ  Bonaire, Saint Eustatius and Saba
BR  Brazil
BS  Bahamas
BT  Bhutan
BV  Bouvet Island
BW  Botswana
BY  Belarus
BZ  Belize
CA  Canada
CC  Cocos (Keeling) Islands
CD  Congo, The Democratic Republic of the
CF  Central African Republic
CG  Congo
CH  Switzerland
CI  Cote d'Ivoire
CK  Cook Islands
CL  Chile
CM  Cameroon
CN  China
CO  Colombia
CR  Costa Rica
CU  Cuba
CV  Cape Verde
CW  Curacao
CX  Christmas Island
CY  Cyprus
CZ  Czech Republic
DE  Germany
DJ  Djibouti
DK  Denmark
DM  Dominica
DO  Dominican Republic
DZ  Algeria
EC  Ecuador
EE  Estonia
EG  Egypt
EH  Western Sahara
ER  Eritrea
ES  Spain
ET  Ethiopia
EU  Europe
FI  Finland
FJ  Fiji
FK  Falkland Islands (Malvinas)
FM  Micronesia, Federated States of
FO  Faroe Islands
FR  France
GA  Gabon
GB  United Kingdom
GD  Grenada
GE  Georgia
GF  French Guiana
GG  Guernsey
GH  Ghana
GI  Gibraltar
GL  Greenland
GM  Gambia
GN  Guinea
GP  Guadeloupe
GQ  Equatorial Guinea
GR  Greece
GS  South Georgia and the South Sandwich Islands
GT  Guatemala
GU  Guam
GW  Guinea-Bissau
GY  Guyana
HK  Hong Kong
HM  Heard Island and McDonald Islands
HN  Honduras
HR  Croatia
HT  Haiti
HU  Hungary
ID  Indonesia
IE  Ireland
IL  Israel
IM  Isle of Man
IN  India
IO  British Indian Ocean Territory
IQ  Iraq
IR  Iran, Islamic Republic of
IS  Iceland
IT  Italy
JE  Jersey
JM  Jamaica
JO  Jordan
JP  Japan
KE  Kenya
KG  Kyrgyzstan
KH  Cambodia
KI  Kiribati
KM  Comoros
KN  Saint Kitts and Nevis
KP  Korea, Democratic People's Republic of
KR  Korea, Republic of
KW  Kuwait
KY  Cayman Islands
KZ  Kazakhstan
LA  Lao People's Democratic Republic
LB  Lebanon
LC  Saint Lucia
LI  Liechtenstein
LK  Sri Lanka
LR  Liberia
LS  Lesotho
LT  Lithuania
LU  Luxembourg
LV  Latvia
LY  Libyan Arab Jamahiriya
MA  Morocco
MC  Monaco
MD  Moldova, Republic of
ME  Montenegro
MF  Saint Martin
MG  Madagascar
MH  Marshall Islands
MK  Macedonia
ML  Mali
MM  Myanmar
MN  Mongolia
MO  Macao
MP  Northern Mariana Islands
MQ  Martinique
MR  Mauritania
MS  Montserrat
MT  Malta
MU  Mauritius
MV  Maldives
MW  Malawi
MX  Mexico
MY  Malaysia
MZ  Mozambique
NA  Namibia
NC  New Caledonia
NE  Niger
NF  Norfolk Island
NG  Nigeria
NI  Nicaragua
NL  Netherlands
NO  Norway
NP  Nepal
NR  Nauru
NU  Niue
NZ  New Zealand
OM  Oman
PA  Panama
PE  Peru
PF  French Polynesia
PG  Papua New Guinea
PH  Philippines
PK  Pakistan
PL  Poland
PM  Saint Pierre and Miquelon
PN  Pitcairn
PR  Puerto Rico
PS  Palestinian Territory
PT  Portugal
PW  Palau
PY  Paraguay
QA  Qatar
RE  Reunion
RO  Romania
RS  Serbia
RU  Russian Federation
RW  Rwanda
SA  Saudi Arabia
SB  Solomon Islands
SC  Seychelles
SD  Sudan
SE  Sweden
SG  Singapore
SH  Saint Helena
SI  Slovenia
SJ  Svalbard and Jan Mayen
SK  Slovakia
SL  Sierra Leone
SM  San Marino
SN  Senegal
SO  Somalia
SR  Suriname
SS  South Sudan
ST  Sao Tome and Principe
SV  El Salvador
SX  Sint Maarten
SY  Syrian Arab Republic
SZ  Swaziland
TC  Turks and Caicos Islands
TD  Chad
TF  French Southern Territories
TG  Togo
TH  Thailand
TJ  Tajikistan
TK  Tokelau
TL  Timor-Leste
TM  Turkmenistan
TN  Tunisia
TO  Tonga
TR  Turkey
TT  Trinidad and Tobago
TV  Tuvalu
TW  Taiwan
TZ  Tanzania, United Republic of
UA  Ukraine
UG  Uganda
UM  United States Minor Outlying Islands
US  United States
UY  Uruguay
UZ  Uzbekistan
VA  Holy See (Vatican City State)
VC  Saint Vincent and the Grenadines
VE  Venezuela
VG  Virgin Islands, British
VI  Virgin Islands, U.S.
VN  Vietnam
VU  Vanuatu
WF  Wallis and Futuna
WS  Samoa
YE  Yemen
YT  Mayotte
ZA  South Africa
ZM  Zambia
ZW  Zimbabwe
Share:
11,594
P110
Author by

P110

I do some programming.

Updated on June 05, 2022

Comments

  • P110
    P110 almost 2 years

    I'm trying to detect whether a user is visiting my website from a European country or not. I'm using the Cloudflare proxy & CDN so have to make use of the headers that they pass on (like so):

    $country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];
    

    I'm not sure what return values I should be listening out for from Cloudflare that would allow me to do something like this:

    if($location == '1' || $location == '2' || $location == '3'){
        // Europe
    }else{
        // Not Europe
    }
    

    so can anyone help me work out the values I should process?

    Thanks for any help!

  • Andrei
    Andrei over 9 years
    Careful, this list is actually incorrect. Please don't post something like this without getting an official list from Cloudflare. "UK" doesn't work on Cloudflare, only "GB" works. I had an issue with an ad agency because of this because the ad wasn't working in the UK...
  • Gergo Erdosi
    Gergo Erdosi over 9 years
    @xtrimsky Contacted CloudFlare, they sent me a list of possible values. I updated my answer accordingly.
  • Andrei
    Andrei over 9 years
    Thank you, that is awesome! I think you are the first one to be posting this list on the internet (I wasn't able to find it anywhere else).
  • Donzo
    Donzo over 8 years
    Thanks so much for this. It really helped.
  • P110
    P110 over 3 years
    Thanks for the link to the CF help page, as far as I know, this question was posted before CloudFlare made that information publically available (hence the back and forth with them in the accepted answer) but thanks for posting a full list :)
  • a55
    a55 over 3 years
    @P110 Thanks for your answer at all, CloudFlare should have an officail list, not a link that its contents may changes in future