Po adresie IP odwiedzającego Twoją witrynę możesz dowiedzieć się o nim całkiem sporo - kraj, miasto, nazwa i adres e-mail dostawcy Internetu itp. Ale główną wartością jest to, że adres IP może służyć jako identyfikator użytkownika dla skryptów po stronie serwera. Poniżej opisano, w jaki sposób można określić adres IP za pomocą PHP.
Czy to jest to konieczne
Podstawowa znajomość PHP
Instrukcje
Krok 1
Aby wyodrębnić adres IP z nagłówków wysyłanych do serwera żądań przeglądarki, użyj funkcji getenv. Odczytuje określone dla niego wartości ze zmiennych środowiskowych. Zmienna o nazwie REMOTE_ADDR służy do przechowywania adresu IP odwiedzającego. Jednak klient może użyć serwera proxy, w którym to przypadku zmienna będzie zawierać jego adres, a nie ten, który chcesz. Możesz dowiedzieć się, że internauta używa pośredniego adresu IP, patrząc na zmienną środowiskową o nazwie HTTP_VIA. Wszystkie adresy serwerów proxy biorących udział w łańcuchu są w nim umieszczane, oddzielone przecinkami. Serwery pośrednie muszą umieścić adres odwiedzającego w zmiennej o nazwie HTTP_X_FORWARDED_FOR, ale zależy to całkowicie od ustawień proxy. Oznacza to, że aby objąć jak najwięcej możliwości określenia adresu IP, należy sprawdzić zawartość co najmniej trzech zmiennych: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, a najlepiej
Krok 2
Możesz połączyć sprawdzanie wszystkich trzech zmiennych w jedną linię kodu PHP, na przykład tak:
$ ipAddr = getenv ('HTTP_CLIENT_IP') lub $ ipAddr = getenv ('HTTP_X_FORWARDED_FOR') lub $ ipAddr = getenv ('REMOTE_ADDR');
Po uzyskaniu w ten sposób wartości adresu IP wskazane jest usunięcie go z ewentualnych zniekształceń i niepotrzebnych znaków. Możesz użyć do tego wyrażenia regularnego:
$ ipAddr = trim (preg_replace ('# ^ ([^,] +) (,. *)? #', '$ 1', $ ipAddr));
Krok 3
Pozostaje połączyć oba wiersze kodu w jedną funkcję:
funkcja getIP () {
$ ipAddr = getenv ('HTTP_CLIENT_IP') lub $ ipAddr = getenv ('HTTP_X_FORWARDED_FOR') lub $ ipAddr = getenv ('REMOTE_ADDR');
return trim (preg_replace ('# ^ ([^,] +) (,. *)? #', '$ 1', $ ipAddr));
}