Kurs "WordPress: Pierwsze kroki" (na dobry początek)

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. 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 (pomijając całkowite blokady, bo wtedy najlepiej to zrobić już na etapie DNSów, czyli Cloudflare).

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. Możemy też wykorzystać ciasteczka (cookies).

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 https://webinsider.pl;

Ale to już zależy od potrzeb…

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 chcemy korzystać z blokady już na etapie DNSów (Cloudflare), nie mamy też 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( 'https://webinsider.pl', 301 );
        exit();
    }
}

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( 'https://webinsider.pl', 301 );
        exit();
    }
}
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 | Lub postaw nam kawę :-)
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Kurs "WordPress: Pierwsze kroki" (na dobry początek)
Patryk
Kurs "WordPress: Pierwsze kroki" (bezpłatna lekcja)