2008-10-06 3 views
0

Этот PHP код ...Почему getenv ('REMOTE_ADDR') дает мне пустой IP-адрес?

207 if (getenv(HTTP_X_FORWARDED_FOR)) { 
208  $ip = getenv('HTTP_X_FORWARD_FOR'); 
209  $host = gethostbyaddr($ip); 
210 } else { 
211  $ip = getenv('REMOTE_ADDR'); 
212  $host = gethostbyaddr($ip); 
213 } 

Выдает это предупреждение ...

Предупреждение: gethostbyaddr() [function.gethostbyaddr]: Адрес является не в ABCD форме в C: \ inetpub ... \ filename.php on line

Кажется, что $ ip не имеет значения.

ответ

11

на php.net он говорит следующее:

Функция getenv не работает, если ваш сервер API это ASAPI (IIS). Итак, попробуйте не использовать getenv('REMOTE_ADDR'), но $_SERVER["REMOTE_ADDR"].

Возможно, вы попытались сделать это с помощью $_SERVER?

4

Почему бы вам не использовать

$_SERVER['REMOTE_ADDR'] 

и

$_SERVER['HTTP_X_FORWARDED_FOR'] 
1

Прежде всего, getenv() принимает строку в качестве параметра. В строке 207, вы должны использовать:

getenv('HTTP_X_FORWARDED_FOR') 

... вместо:

getenv(HTTP_X_FORWARDED_FOR) 

Во-вторых, доступ к этим переменным через $ _SERVER является более надежным решением, так как GetEnv() имеет тенденцию показывать разные поведение на разных платформах.

Кроме того, эти переменные, вероятно, не будут работать, если вы используете этот скрипт через CLI.

Попробуйте var_dump ($ ip); и посмотрите, что содержит переменная.

2

Лучшее решение уже предоставлено. Но все-таки:

getenv('HTTP_X_FORWARD_FOR'); 

должен быть

getenv('HTTP_X_FORWARDED_FOR'); 

Да ... иногда компьютеры хотят иметь строки они понимают ;-)