【问题标题】:PHP: getting user's IP address using lighttpdPHP:使用 lighttpd 获取用户的 IP 地址
【发布时间】:2021-08-04 16:32:34
【问题描述】:

我试过这个功能,但这总是返回主机/网站的 IP 地址而不是用户的 IP 知道为什么以及如何解决它吗?

该网站未托管在 localhost 上,我正在使用 lighttpd 托管该网站

<?php

function getUserIpAddr(){
    if(!empty($_SERVER['HTTP_CLIENT_IP'])){
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }else{
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

$ip = getUserIpAddr();
echo $ip;

?>

【问题讨论】:

  • 听起来主机有一个反向代理,所以所有请求都来自它。除了更改反向代理的工作方式之外,您无能为力(并且根据它的声音,这是您需要要求托管服务做的事情)来设置您正在寻找的转发标头之一。跨度>
  • 或者好像他们已经在服务器变量中传递了它,您也可以通过转储/记录 $_SERVER 来检查自己。
  • 昆汀的网站托管在我的 linux 机器上

标签: php ip lighttpd


【解决方案1】:

lighttpd 在 CGI 环境变量 REMOTE_ADDR 中提供远程地址。

lighttpd 不会设置HTTP_CLIENT_IP,除非请求提供Client-IP 标头。除非请求提供 X-Forwarded-For 标头,否则 lighttpd 不会设置 HTTP_X_FORWARDED_FOR。

在您使用的标头中,只有 REMOTE_ADDR 是可信任的。您永远不应该信任由客户端控制的数据。如果您的设置具有设置标头(例如 X-Forwarded-For)的中间代理,并且您信任中间代理,并且除受信任的代理之外的任何其他设备都无法访问您的服务器,那么这些标头也可以信任。

如果您的设置位于受信任的代理之后,并且您想使用 X-Forwarded-For,请查看 lighttpd mod_extforward,它可以解析 X-Forwarded-For 或标准化标头(例如 Forwarded),以将上游远程地址放入 @ 987654332@为您服务。 lighttpd mod_extforward 也支持 HAProxy PROXY 协议。

【讨论】:

  • 感谢您解释一切
【解决方案2】:

试试这个代码

$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
echo $ipaddress;

【讨论】:

    【解决方案3】:
    <?php
    // Print IP of user
    $ip = $_SERVER['REMOTE_ADDR'];
    $ip = htmlentities($ip, ENT_COMPAT, "UTF-8");
    echo"$ip";
    
    // You can also get the users hostname
    $hostname = gethostbyaddr($_SERVER['REMOTE_ADDR']);
    $hostname = htmlentities($hostname, ENT_COMPAT, "UTF-8");
    echo"$hostname";
    ?>
    

    【讨论】:

    • OP 已经在查看 $_SERVER['REMOTE_ADDR'] 并且没有给出他们想要的结果。
    猜你喜欢
    • 2011-06-08
    • 2013-09-21
    • 2014-09-27
    • 2011-02-06
    • 2013-03-19
    • 2013-07-07
    • 1970-01-01
    • 2012-06-12
    • 2013-08-01
    相关资源
    最近更新 更多