Её образ на сердце высечен или Как узнать IP пользователя в PHP (advanced code version)
- 21.10.2006 22:04
- Прямая ссылка »
Вот, конкурент один давеча обратился с предложением продать ему механизм генерации тикетов, чтобы, стало быть, кто попало прямые ссылки на его мп3 не ставил.
В принципе, ничего сложного, казалось бы. Но в итоге пришлось реально потрахаться. Во-первых, чтобы прикрутить к его извращённой системе, которая не даёт скачать песенку, пока пользователь 4 страницы с рекламой не посмотрит. :) И, кроме всего прочего, потому, что когда стали прикручивать проверку по IP, оказалось, что на его сервере с мп3шками (который, как и у меня, существует отдельно от сайта) по переменной окружения REMOTE_ADDR показывается тупо "127.0.0.1" (я, кстати, когда с этой проблемой обратился на IRC-канал #php, меня тут же обсмеяли и занесли в хуморные цитаты канала, а когда я им объяснил подробно, они тут же растерялись, и решения никто так и не смог придумать; отсюда вывод: если на канал заходит X-tremAl_Raven и задаёт тупейший на первый взгляд вопрос, значит вопрос далеко не такой простой, как вам кажется :)).
Код, часто встречающийся в инете (только написанный на perl'е):
$user_ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
if (!strcmp($user_ip,"127.0.0.1")){
if (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP']) && (strcmp($HTTP_SERVER_VARS['HTTP_CLIENT_IP'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
elseif (isset($HTTP_SERVER_VARS['X_CLIENT_IP']) && (strcmp($HTTP_SERVER_VARS['X_CLIENT_IP'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['X_CLIENT_IP'];
elseif (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']) && (strcmp($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'];
}
тоже мало помог, т.к. HTTP_CLIENT_IP, X_CLIENT_IP и HTTP_X_FORWARDED_FOR были пустые. Но тут добрые люди (с канала #freebsd) подсказали простую до гениальности весчь: "Ты глянь, чё вообще в переменных окружения лежит". По итогам исследований был написал следующий код:
$user_ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
if (!strcmp($user_ip,"127.0.0.1")){
if (isset($HTTP_SERVER_VARS['HTTP_CLIENT_IP']) && (strcmp($HTTP_SERVER_VARS['HTTP_CLIENT_IP'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['HTTP_CLIENT_IP'];
elseif (isset($HTTP_SERVER_VARS['HTTP_X_REAL_IP']) && (strcmp($HTTP_SERVER_VARS['HTTP_CLIENT_IP'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['HTTP_X_REAL_IP'];
elseif (isset($HTTP_SERVER_VARS['X_CLIENT_IP']) && (strcmp($HTTP_SERVER_VARS['X_CLIENT_IP'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['X_CLIENT_IP'];
elseif (isset($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']) && (strcmp($HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'],"127.0.0.1")))
$user_ip = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR'];
}
Пользуйтесь на здоровье :)
ЗЫ: Если ещё есть желающие купить/заказать какой-нибудь движок — обращайтесь.