2013-08-01 16 views
6

Jakoś $_SERVER['REMOTE_ADDR'] zwraca pusty ciąg, mam ten sam kod (jako część skryptu) działający na wielu serwerach i działa wszędzie, wszystkie są takie same.

Dziwne jest to, że po ponownym uruchomieniu apache i załadowaniu strony, działa dokładnie jeden raz, jeśli przeładuję stronę + cały czas, jest pusta. Miałem inne osoby próbujące, ten sam rezultat, puste.

ktoś zasugerował, że to było coś z konfiguracją IPv6, teraz całkowicie wyłączyłem IPv6, ale problem nadal występuje.

+0

Korzystanie z Apache? Jakieś buforowanie? – exussum

+0

Tak, apache, bez buforowania. –

+0

Czy jesteś pewien, że PHP jest używane przez Apache jako moduł, a nie CGI? – Dawlys

Odpowiedz

2

jeśli jesteś za serwerem proxy, możesz użyć $_SERVER['HTTP_X_FORWARDED_FOR'] lub $_SERVER['HTTP_CLIENT_IP'] zamiast $_SERVER['REMOTE_ADDR']. zależy to od konfiguracji serwera proxy.

1

Tak, możliwe jest puste REMOTE_ADDR. więc jeśli chcesz, możesz użyć tego kodu, które mogę używać, aby uzyskać adres IP na podstawie 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']; 
} 

mam sprawdzanie REMOTE_ADDR pierwszy, ponieważ jest bardziej niezawodny i czasami HTTP_X_FORWARDED_FOR mogą być sfałszowane przez użytkowników

+0

Myślę, że lepiej jest użyć 'isset ($ _ SERVER ['HTTP_X_FORWARDED_FOR'])' zamiast 'empty ($ _ SERVER ['HTTP_X_FORWARDED_FOR'])' – Andrew

+0

znasz różnicę z isset i pusty prawda? Kiedy patrzyłem wcześniej na dziennik mojego serwera. Napotkałem, że niektóre przeglądarki wciąż wysyłają http_x_forward_for, ale są puste. więc myślę, że jego puste() jest potrzebne – fedmich

+0

faktycznie najlepiej jest używać obu ...ponieważ jest możliwe, że klienci nie używają proxy, więc nie mają zmiennej '$ _SERVER ['HTTP_X_FORWARDED_FOR']' variable set .... więc po prostu sprawdź puste spowoduje pewne problemy, gdy php parsuje ... imho .. – Andrew

0

Posiadałem kod na nowej maszynie wirtualnej, która wyglądała tak. Jest on nazywany z pliku javascript:

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

Pracował na starym serwerze oczywiście i ja zarysowania głowę na chwilę myśli, że coś złego Apache..Was tam modułu brakuje? Jakieś niejasne ustawienie Apache'a, którego nie mogę znaleźć ?. Myślałem, że Apache nie wysyła zmiennych Server. To było aż Próbowałem zwykły ol”fashioned sposób i to działało:

echo $_SERVER['REMOTE_ADDR']; 

Okazało się, musiałem edytować php.ini i ustaw short_open_tag do Na. Facepalm - skróty tagów php nie działają. Mam nadzieję, że pomoże to uratować komuś głowę czasu :)

0

Może to pomoże. Dzwoniłem do skryptu php z aplikacji na iPhone'a, aby zaktualizować bazę danych, która zawierała adres IP. IP to nowe pole dodane kilka dni temu i nie było aktualizowane z iPhone'a, ale działało poprawnie z Androidem. Problem polega na tym, że nowy skrypt php nie był używany przez iPhone'a, dopóki telefon nie został wyłączony i ponownie uruchomiony. Przechowywał go w pamięci podręcznej.

Ktoś wie, jak opróżnić te stare pliki php?

Powiązane problemy