Как определить 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, для более корректной обработки данных.

Поделиться в соцсетях:
Статьи на похожую тематику

С вашим WordPress сайтом проблемы? нужен дополнительный функционал? нестандартный плагин или сверстать новую страницу?
Тогда напишите мне через форму обратной связи, и я постараюсь вам помочь.

Оставить комментарий

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