PHP $ _SERVER ['REMOTE_ADDR']为空

时间:2013-08-01 21:33:47

标签: php apache

不知怎的$_SERVER['REMOTE_ADDR']返回一个空字符串,我有相同的代码(作为脚本的一部分)在多个服务器上运行,它可以在其他任何地方工作,它们都是相同的设置。

奇怪的是,当我重新启动apache并加载页面时,它只运行一次,如果我重新加载网站+之后的所有时间,它都是空的。我有其他人尝试,同样的结果,空。

有人建议使用IPv6配置,我现在已经完全禁用了IPv6,但问题仍然存在。

3 个答案:

答案 0 :(得分:3)

如果您在代理服务器后面,则可以使用$_SERVER['HTTP_X_FORWARDED_FOR']$_SERVER['HTTP_CLIENT_IP']代替$_SERVER['REMOTE_ADDR']。 这取决于您的代理配置方式。

答案 1 :(得分:1)

是的,REMOTE_ADDR可能为空。 所以,如果你想要你可以使用我用来获取基于HTTP_X_FORWARDED_FOR的ip的代码

<?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

答案 2 :(得分:0)

我在新VM上有代码,看起来像这样。它是从一个javascript文件中调用的:

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

当然在旧服务器上工作了一段时间我正在摸不着头脑,认为Apache有问题。有没有模块丢失?我无法找到一些模糊的Apache设置?我认为Apache并没有发送Server变量。直到我尝试了普通的ol&#39;时尚的方式,它的工作原理:

echo $_SERVER['REMOTE_ADDR'];

原来我必须编辑php.ini并将 short_open_tag 设置为开启。 Facepalm - 快捷方式php标签不起作用。希望这将有助于拯救别人的时间:)