不知何故$_SERVER['REMOTE_ADDR']
返回一个空字符串,我在多个服务器上运行相同的代码(作为脚本的一部分)并且它在其他任何地方都可以工作,它们都是相同的设置。
奇怪的是,当我重新启动 apache 并加载页面时,它只工作一次,如果我重新加载站点 + 之后的所有时间,它就是空的。我让其他人尝试过,同样的结果,空的。
有人建议它与 IPv6 配置有关,我现在完全禁用了 IPv6,但问题仍然存在。
如果您在代理服务器后面,则可以使用$_SERVER['HTTP_X_FORWARDED_FOR']
or$_SERVER['HTTP_CLIENT_IP']
代替$_SERVER['REMOTE_ADDR']
. 这将取决于您的代理的配置方式。
是的,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可能会被用户欺骗
我在一个看起来像这样的新 VM 上有代码。它是从 javascript 文件中调用的:
<?php
$hostip = $_SERVER['REMOTE_ADDR'];
?>
var myip = "<?=$hostip ?>";
当然是在旧服务器上工作,我摸索了一会儿,认为 Apache 有问题。是否缺少模块?我找不到一些晦涩的 Apache 设置?我认为 Apache 没有发送服务器变量。直到我尝试了普通的老式方式并且它起作用了:
echo $_SERVER['REMOTE_ADDR'];
结果我不得不编辑 php.ini 并将short_open_tag设置为On。Facepalm - 快捷方式 php 标签不起作用。希望这将有助于节省其他人的时间:)