jjzjj

php - 我如何使用 CloudFlare 地理定位检测所有欧洲国家

coder 2023-12-30 原文

我正在尝试检测用户是否从欧洲国家/地区访问我的网站。我正在使用 Cloudflare 代理和 CDN,因此必须使用它们传递的 header (像这样):

$country_code = $_SERVER["HTTP_CF_IPCOUNTRY"];

我不确定我应该从 Cloudflare 监听哪些返回值可以让我做这样的事情:

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

那么谁能帮我算出我应该处理的值?

感谢您的帮助!

最佳答案

$_SERVER["HTTP_CF_IPCOUNTRY"] 的值是一个国家代码。所以首先你需要一个 list所有欧洲国家代码。

$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');

然后您可以使用此列表来验证请求:

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

如果您想定位特定区域,可以使用这些列表:

$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');

例如:

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

我联系了 CloudFlare 以确保国家代码列表有效。他们向我发送了 $_SERVER["HTTP_CF_IPCOUNTRY"] 的可能值列表。我验证了上述数组,这些数组中的所有国家/地区代码都在可能值列表中。

作为引用,这里是可能值的列表:

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

关于php - 我如何使用 CloudFlare 地理定位检测所有欧洲国家,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23963979/

有关php - 我如何使用 CloudFlare 地理定位检测所有欧洲国家的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  4. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  5. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  6. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  7. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  8. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  9. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  10. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

随机推荐