Envato Elements - pobierasz co chcesz, ile chcesz

Kilka tygodni temu za pomocą naszego formularza kontaktowego trafiło do mnie zapytanie o pomoc w pewnej sprawie – 2 sklepy internetowe, jeden skierowany na konkretny rynek (kraj), drugi globalny – dla całej reszty.

Szybko udało się dojść do porozumienia, i odpowiednie rozwiązanie zostało sprawnie wdrożone, dzięki czemu ja zyskałem nowego klienta, a Wy kolejny wpis…

Geolokalizacja użytkownika strony internetowej

Jak to często bywa do tematu można podejść na kilka różnych sposobów, to ja zazwyczaj w tego typu sytuacji korzystam z możliwości jakie daje „przy okazji” usługa CloudFlare, dzięki czemu wdrożenie jest niezwykle proste, a zarazem – dzięki rozbudowanej infrastrukturze CloudFlare – dość skuteczne.

Przedstawione tu rozwiązania w większości wykorzystują dane uzyskane z usługi CloudFlare, dlatego wszystkim zainteresowanym tego typu rozwiązaniem polecam zapoznać się również z naszym wpisem o samej usłudze CloudFlare.

Aktywacja IP Geolocation w CloudFlare

Z tego co kojarzę, to geolokalizacja na podstawie adresów IP w CloudFlare jest domyślnie aktywna dla każdej dodanej domeny, ale jakby tak nie było to możecie aktywować w ustawieniach, w zakładce „network” dla wybranej domeny:

cloudflare_ip-geolocation-setting

Geolokalizacja w webserwerze Nginx

Zacznę od wykorzystania geolokalizacji od CloudFlare na przykładzie webserwera Nginx, bo jeśli mam taką możliwość (np. serwer VPS, serwer dedykowany, Raspberry Pi) to preferuje „tego typu operacje” wykonywać jak najniżej, czyli w tym przypadku po stronie webserwera.

Jeśli mamy domenę dodaną do CloudFlare to nie musimy nic dodatkowego robić (można ew. od razu ustawić rozpoznawanie po stronie webserwera prawdziwego adresu IP użytkownika), od razu bierzemy się za konfigurację pliku vHosta naszej domeny.

W tym celu w sekcji „serwer” pliku vHosta wybranej domeny dodajemy np. taki wpis:

if ( $http_cf_ipcountry != PL ) {
        return 403;
}

Za pomocą tego kodu sprawdzamy zmienną „$http_cf_ipcountry” przesyłaną do webserwera przez usługę CloudFlare, i jeśli kod kraju użytkownika (na podstawie jego adresu IP) jest inny niż „PL”, to taki użytkownik zostanie zablokowany (błąd 403).

Oczywiście możemy sytuację odwrócić, i podjąć konkretne działanie (np. brak dostępu, kod błędu 403) wyświetlić dla użytkowników z wybranego kraju:

if ( $http_cf_ipcountry = PL ) {
        return 403;
}

Jest to podstawowa wersja, i w niektórych przypadkach lepszym rozwiązaniem będzie skorzystanie z trochę bardziej rozbudowanej formy, dzięki możemy zarządzać np. dostępem (lub brakiem dostępu) dla większej grupy kodów kraju użytkownika.

W tym przypadku nasze działanie dzielimy na 2 części, pierwszy wpis dodajemy przed blokiem ustawień serwera, czyli przed wpisem:

server {

Dodajemy tu kod, którym sprawdzamy kraj użytkownika (na podstawie jego adresu IP), i zależnie od kodu kraju przypisujemy do utworzonej zmiennej jakąś wartość:

# CloudFlare GeoIP 1/2
map $http_cf_ipcountry $cfgeoip {
    default no;
    PL yes;
    US yes;
}

W powyższym kodzie ponownie korzystamy z nagłówka „http_cf_ipcountry”, choć tym razem tworzymy dodatkową zmienną „cfgeoip”, do której przypisujemy wartość „yes” lub „no” – zależnie od kodu kraju jaki będzie powiązany z adresem IP użytkownika.

Z racji tego, że w tym przypadku strona ma być dostępna tylko dla użytkowników z Polski i USA, to „wszystkim” przypisujemy wartość „no”, a tylko użytkownikom, w przypadku których uzyskamy kod kraju „PL” (Polska) lub „US” (USA) przypisujemy wartość „yes”.

Dalej – już w sekcji „server” – wstawiamy kolejny fragment kodu, który na podstawie wartości zmiennej „cfgeoip” wykona odpowiednie działanie, w naszym przypadku każdy kto nie otrzyma kodu kraju „PL” lub „US” dostanie standardowy kod błędu 403 – dostęp zabroniony:

# CloudFlare GeoIP 2/2
if ( $cfgeoip = no ) {
    return 403;
}

Oczywiście blokada (return 403) to nie jedyne działanie jakie możemy zdefiniować, ale na czymś przykład oprzeć musiałem. W każdym razie mogą to być też inne działania, np. przekierowanie:

return 301 //webinsider.pl;

GeoIP, czyli alternatywa dla CloudFlare

Zainteresowanym temat, ale z jakichś przyczyn niechcącym korzystać z CloudFlare zaproponuje jeszcze jedno rozwiązanie, które opiera się na dostępnej lokalnie – na serwerze – bazie danych.

Zaczynamy od instalacji niezbędnych elementów na serwerze:

sudo apt-get install geoip-database libgeoip1

A samo zastosowanie może wyglądać tak:

# GeoIP 1/2
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $geoip {
    default no;
    PL yes;
}

I do tego w sekcji „serwer”:

# GeoIP 2/2
if ( $geoip = no ) {
    return 403;
}

Choć z tego rozwiązania od dawna nie korzystam, to jest w moich notatkach, a może komuś się przyda…

Geolokalizacja w PHP

W przypadku gdy nie mamy możliwości wykonania tego typu operacji po stronie webserwera – np. w przypadku hostingu współdzielonego – możemy skorzystać z PHP:

if ( isset( $_SERVER["HTTP_CF_IPCOUNTRY"] ) ) {
    $geoip = $_SERVER["HTTP_CF_IPCOUNTRY"];
    }
    if ( $geoip != 'PL' ) {
        [ Jakieś działanie, np.:
        wp_redirect( '//webinsider.pl', 301 );
        exit(); // AntyCache ]
    }
}

W powyższym przykładzie sprawdzamy nagłówek „HTTP_CF_IPCOUNTRY”, i jeśli kod kraju jest inny niż „PL”, to wykonujemy zdefiniowane działanie.

Geolokalizacja w WordPressie

Jeśli już mamy jak korzystać z geolokalizacji IP od CloudFlare w PHP, to już tylko krok do tego, by wykorzystać to np. w WordPressie.

function webinsider_wp_geoip_redirect() {
    if ( isset( $_SERVER["HTTP_CF_IPCOUNTRY"] ) ) {
        $geoip = $_SERVER["HTTP_CF_IPCOUNTRY"];
    }
    if ( $geoip != 'PL' ) {
        [ Jakieś działanie, np.:
        wp_redirect( '//webinsider.pl', 301 );
        exit(); // AntyCache ]
    }
}
add_filter( 'template_redirect', 'webinsider_wp_geoip_redirect' );

Zamiast filtra można też podobny efekt uzyskać za pomocą akcji:

do_action( 'template_redirect', 'webinsider_wp_geoip_redirect' );

Informacje jak i gdzie wstawić powyższy kod znajdziecie na tej stronie, ew. można też przygotować wtyczkę typu „Must-use”, by mieć pewność, że nikt przez przypadek jej nie wyłączy…

(!) Zgłoś błąd na stronie
Potrzebujesz profesjonalnej pomocy? Skontaktuj się z nami!
Spodobał Ci się artykuł? Zapisz się do naszego Newslettera - ZERO SPAMu, same konkrety, oraz dostęp do dodatkowych materiałów przeznaczonych dla subskrybentów!
Na podany adres e-mail otrzymasz od nas wiadomość e-mail, w której znajdziesz link do potwierdzenia subskrypcji naszego Newslettera. Dzięki temu mamy pewność, że nikt nie dodał Twojego adresu przez przypadek. Jeśli wiadomość nie przyjdzie w ciągu najbliższej godziny (zazwyczaj jest to maksymalnie kilka minut) sprawdź folder SPAM.
Janusz i Janusz zapisali się do Newslettera WebInsider.pl i... sobie chwalą
WebInsider poleca księgowość wFirma
WebInsider korzysta z VPSa w HitMe.pl
WebInsider poleca VPSy DigitalOcean
WebInsider poleca serwis Vindicat
Napisz komentarz
wipl_napisz-komentarz_01Jeśli informacje zawarte na tej stronie okazały się pomocne, możesz nam podziękować zostawiając poniżej swój komentarz.

W tej formie możesz również zadać dodatkowe pytania dotyczące wpisu, na które – w miarę możliwości – spróbujemy Ci odpowiedzieć.
Linki partnerskie
Niektóre z linków na tej stronie to tzw. „linki partnerskie”, co oznacza, że jeśli klikniesz na link i dokonasz wymaganej akcji (np. zakup/rejestracja) możemy otrzymać za to prowizję. Pamiętaj, że polecamy tylko te produkty i usługi, z których sami korzystamy, i uważamy, że są tego na prawdę warte… :-)
Znaki towarowe i nazwy marek
W niektórych wpisach (oraz innych miejscach na stronie) mogą być przedstawione/użyte znaki towarowe i/lub nazwy marek, które stanowią własność intelektualną tych podmiotów, a zostały użyte wyłącznie w celach informacyjnych.
Janusz i Janusz dzięki motywowi Divi od Elegant Themes koszą siano robiąc strony