2013-08-01 5 views
6

Как-то $_SERVER['REMOTE_ADDR'] возвращает пустую строку, у меня тот же код (как часть скрипта), запущенный на нескольких серверах, и он работает повсюду, они все одинаковы.

Странно, когда я перезапускаю apache и загружаю страницу, он работает ровно один раз, если я перезагружаю сайт + все время после этого, он пуст. У меня были другие попытки, одинаковый результат, пустой.

Кто-то предположил, что это что-то с конфигурацией IPv6, теперь я полностью отключил IPv6, но проблема не устранена.

+0

Использование Apache? Любое кэширование? – exussum

+0

Да apache, нет кеширования. –

+0

Вы уверены, что PHP используется Apache как модуль, а не CGI? – Dawlys

ответ

2

Если вы находитесь за прокси-сервером, вы можете использовать $_SERVER['HTTP_X_FORWARDED_FOR'] или $_SERVER['HTTP_CLIENT_IP'] вместо $_SERVER['REMOTE_ADDR']. это будет зависеть от того, как настроен ваш прокси.

1

Да, REMOTE_ADDR может быть пустым. так что если вы хотите, вы можете использовать этот код, который я использую, чтобы получить IP-адрес на основе HTTP_X_FORWARDED_FOR

<?php 
    if(! empty($_SERVER['REMOTE_ADDR'])){ 
    $ip = $_SERVER['REMOTE_ADDR']; 
} 
else{ 
    $ip = empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? '' : $_SERVER['HTTP_X_FORWARDED_FOR']; 
} 

Я проверяю REMOTE_ADDR первых, как это более надежно, а иногда HTTP_X_FORWARDED_FOR может быть подменен пользователями

+0

Я думаю, что лучше использовать 'isset ($ _ SERVER ['HTTP_X_FORWARDED_FOR'])' а не 'empty ($ _ SERVER ['HTTP_X_FORWARDED_FOR'])' – Andrew

+0

вы знаете разницу с isset и пустое право? Когда я посмотрел на журнал моего сервера. Я столкнулся с тем, что какой-то браузер по-прежнему отправляет http_x_forward_for, но он пуст. поэтому я думаю, что его пустой() нужен – fedmich

+0

на самом деле лучше использовать оба ...потому что возможно, что клиенты могут не использовать прокси-сервер, поэтому у них нет переменной '$ _SERVER ['HTTP_X_FORWARDED_FOR']' ... поэтому, просто проверив пустое место, вы получите некоторые проблемы, когда php проанализирует его .... imho .. – Andrew

0

У меня был код на новой виртуальной машине, которая выглядела так. Она вызывается из файла JavaScript:

<?php 
$hostip = $_SERVER['REMOTE_ADDR']; 
?> 
var myip = "<?=$hostip ?>"; 

работал на старом сервере, конечно, и я почесал голову на некоторое время, думая, что-то было не так с Apache..Was там модуль не хватает? Какой-то непонятный параметр Apache я не могу найти ?. Я думал, что Apache не отправляет серверные переменные. Это было, пока я не попробовал взбредут»вылепленный путь, и она работала:

echo $_SERVER['REMOTE_ADDR']; 

Оказалось, мне пришлось редактировать php.ini и установить short_open_tag к На. Facepalm - ярлыки php ярлыков не работали. Надеюсь, это поможет спасти кого-то еще главу времени.

0

Возможно, это поможет. Я вызывал php-скрипт из приложения iPhone для обновления базы данных, которая включала ip-адрес. IP-это новое поле, добавленное всего несколько дней назад, и оно не обновлялось с iPhone, но работало корректно с Android. Проблема в том, что новый скрипт php не использовался iPhone до тех пор, пока телефон не был выключен и не перезагружен. Он сохранил его в кеше.

Кто-нибудь знает, как очистить эти старые php-файлы?

Смежные вопросы