Почему ip пуст?

Ysn

Guest
Почему ip пуст?

PHP:
if(@$_SERVER["HTTP_CLIENT_IP"]){$ip=$_SERVER["HTTP_CLIENT_IP"];}
elseif(@$_SERVER["HTTP_X_FORWARDED_FOR"]){$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];}
else{$ip=@$_SERVER["REMOTE_ADDR"];}
Бывает, ip просто пуст. В базу записывается NULL. А у кое-кого вообще записалось
"unknown, 213.179". Почему?
 

Кром

Новичок
Потому что ты записываешь туда или $_SERVER["HTTP_CLIENT_IP" или $_SERVER["HTTP_X_FORWARDED_FOR"]
 

Ysn

Guest
Откровенно говоря, не понял.... а что, нужно вместе??

-~{}~ 25.03.05 03:52:

Я это понимаю так:


PHP:
if(@$_SERVER["HTTP_CLIENT_IP"]){$ip=$_SERVER["HTTP_CLIENT_IP"];}
Если есть HTTP_CLIENT_IP, берем его в переменную.

PHP:
elseif(@$_SERVER["HTTP_X_FORWARDED_FOR"]){$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];}
Если же есть HTTP_X_FORWARDED_FOR, то в переменную берем ее (Я читал в документации, что бывает только одна из двух, одновременно обеих не бывает)

PHP:
else{$ip=@$_SERVER["REMOTE_ADDR"];}
Ну и совсем уж в скучном случае, берем REMOTE_ADDR.


Это неправильно?
 

Кром

Новичок
Нет, неправильно. Самое главное значение, это REMOTE_ADDR. Его нужно записывать в первую очередь. А уже остальные, по желанию. Если нужно вычислять пользователей за proxy и т.д.
 

Ysn

Guest
Да, нужно и за прокси тоже....

Но тут же вроде четко сделано... Если есть первое или второе (видимо прокси), то айпи берем из него... Если же их нету (видимо, человек без прокси) - берем айпи из REMOTE_ADDR

Получается, нужно
PHP:
if(@$_SERVER["REMOTE_ADDR"]){$ip=@$_SERVER["REMOTE_ADDR"];}
if(@$_SERVER["HTTP_CLIENT_IP"]){$ip=$_SERVER["HTTP_CLIENT_IP"];} 
if(@$_SERVER["HTTP_X_FORWARDED_FOR"]){$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];}
да?

Но сразу видно, что это бред. Что-то я запутался...
 

Фанат

oncle terrible
Команда форума
Ysn
перечитай сообщение Кром
Если так и не понял, я поясню. Если ты считаешь себя таким крутым и хитрее всех, и хочешь записывать всякое фуфло из НТТР заголовков, то делать это надо НИ В КОЕМ СЛУЧАЕ не ВМЕСТО ЕДИНСТВЕННОГО РЕАЛЬНОГО адреса, а только ВМЕСТЕ.
То есть, если тебя интерсует вся эта муть, то записывать её надо рядом, ВМЕСТЕ с remote_addr
 

Ysn

Guest
И что же тогда запишется в переменную $ip? Допустим, REMOTE_ADDR и HTTP_CLIENT_IP бывают частенько вместе... И если человек за прокси, то они даже разные. Как это будет работать?
 

Фанат

oncle terrible
Команда форума
в переменную $ip запишется remote_addr
а в переменную $fuflo можешь писать, что угодно.
 

Фанат

oncle terrible
Команда форума
Скажи, до тебя в принципе может дойти идея о том, что если ты хочешь писать что-то, кроме remote_addr, то надо записывать ДВА ip адреса?
а если ты хочешь писать непременно в одну, то кроме remote_addr, туда нельзя ничего писать в принципе, несмотря на твои ламерские рассуждения?
ответь, пожалуйста, на эти вопросы, чтобы я зря время не тратил.
 

Ysn

Guest
Отвечаю:

Может.

Встречный вопрос - а если мне нужно непременно один адрес? И если мне он нужен непременно настоящий? При использовании прокси, remote_addr - проксишный. И, если прокси все же передает настоящий, то он передается в одном из тех двух заголовков.

В конце можно добавить if($ip==""){$ip==@$_SERVER["REMOTE_ADDR"];}

Но это не решит вопроса, что это за "unknown, 213.179".

И наконец, Фанат, прекрати хамить, пожалуйста. Неприятно разговаривать даже. Если считаешь, что теряешь время - не теряй. Не читай мои топики вовсе. Дай отвечать другим, если они захотят.
 

fixxxer

К.О.
Партнер клуба
я хожу в инет с работы через корпоративную прокси.
мой IP = HTTP_X_FORWARDED_FOR = 192.168.0.123
адрес прокси = REMOTE_ADDR = 213.248.1.2

какой из них правильный?
 

Ysn

Guest
То что внутренний - не знаю.
Но для внешних определялок, правильный -HTTP_X_FORWARDED_FOR
Конечно, 192.168 - это внутренний. А как снаружи определяется? Ну например, на www.leader.ru/secure/who.html
 

4m@t!c

Александр
Ysn, ты поределись, какой IP-адрес тебе нужен.
REMOTE_ADDR - это уникальный адрес для всего интернета, такого в сети больше нет, есть толькоодин адрес.
HTTP_X_FORWARDED_FOR - это внутресетвой адрес. Он может практически любым...
Определись. Если ты делаешь приложение для локальной сети, гдже все клиенты сидят за ОДНОЙ И ТОЙ ЖЕ ПРОКСЕЙ, тогда пользуй HTTP_X_FORWARDED_FOR.
Если ты делаешь внешнее приложение, тогда пользуй REMOTE_ADDR и забудь за HTTP_X_FORWARDED_FOR.
Если тебе нужно отслеживать внешню и внутреннюю посещаемость по адресам - пользуй ДВЕ перменные. Потому что:
а) что тебе даст внутренний IP неизвестной тебе сети, кроме набора цифр
б) HTTP_X_FORWARDED_FOR - есть необязательная перменная, есть прокси которые "режут" этот HTTP_X_FORWARDED_FOR.
делай ДВЕ переменнные ДВЕ... А если ты будешь пихать, то внешний, то внутренний IP, как ты будешь определять географию посетителей, не зная адрес прокси или внутренний адрес?
у меня внутренний 10.200.3.1, ты его пишешь в базу и потом проверяешь откуда и что ты получишь???
 

Ysn

Guest
Переданный адрес - это REMOTE_ADDR
Найденный адрес - HTTP_X_FORWARDED_FOR or HTTP_CLIENT_IP

Я в этом уверен.

-~{}~ 25.03.05 20:50:

Мое последнее сообщение - о leader.ru


Значит, в случае сетевого приложения нужен только REMOTE_ADDR? Остальные... как раз неверны? Конечно, внутрисетевой мне не нужен.
 

Фанат

oncle terrible
Команда форума
остальные могут помочь точнее идентифицировать клиента.
Но только помочь. Полагаться на них - нельзя.
Любой пятиклассник, читающий журнал "Ксакеп", напишет тебе туда поэму Льва Толстого "Идиот".
 

4m@t!c

Александр
HTTP_X_FORWARDED_FOR - не есть обязательная составляющая заголовка, в следствие чего на него нельзя полагаться. REMOTE_ADDR есть обязательный праметр, а HTTP_X_FORWARDED_FOR ты должен уточнять координаты пользователя, но строить на его значениях логику своего скрипта НЕЛЬЗЯ. представь, что это просто как пометки в тетраде на полях...
Верные, неверны тока жены бывают... Эти поля могут быть а могут и не быть... а REOMTE_ADDR есть всегда.
[off]Фанат, ты - лучший, не перестаю тебе приятно удивляться![/off]
 
Сверху