Разработка сайтов на WordPress и фреймворке Yii2

Здесь вы можете заказать полный пакет услуг по разработке сайта. Начиная от написания ТЗ до программирования на PHP, JavaScript и верстке.

Как определить IP пользователя в PHP

Как определить регион по IP на PHP

В данной статье рассмотрим одну из распространенных задач в программировании на PHP. А именно, как в php определить ip пользователя.

Если я работаю не с фреймворком (к примеру таким как Yii), то использую одно из готовых решений в виде следующей функции:

function user_ip()
{
	if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unknown"))
	{
		return getenv("HTTP_CLIENT_IP");
	}
	else if(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
	{
		return getenv("HTTP_X_FORWARDED_FOR");
	}
	else if(getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
	{
		return getenv("REMOTE_ADDR");
	}
	else if(!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
	{
		return $_SERVER['REMOTE_ADDR'];
	}
	
	return NULL;
}

В результате, данная функция может вернуть одно из двух вариантов значений:
1. IP пользователя
2. NULL, если IP определить не удалось.

Давайте разберем пример выше подробнее. В листинге используются следующие функции:
getenv() - Получает значение переменной окружения
strcasecmp() - Выполняет бинарно-безопасное сравнение строк без учета регистра
empty() - Проверяет, пустая переменная или нет

В переменных окружения getenv("HTTP_CLIENT_IP") или getenv("HTTP_X_FORWARDED_FOR"), хранится оригинальный IP адрес пользователя. Здесь все зависит от самого прокси сервера. При желании (а вернее его конфигурации), он может или возвращать IP пользователя или не возвращать его. Проведя небольшой тест с двумя проксисерверами, было обнаружено что данные переменные были пусты.

А вот следующие конструкции:

if(getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
{
	return getenv("REMOTE_ADDR");
}
else if(!empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
{
	return $_SERVER['REMOTE_ADDR'];
}

Будут возвращать или IP адрес самого пользователя или IP адрес проксисервера.

Но и в случае не удачи, возвращать NULL, для более корректной обработки данных.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *