【问题标题】:How can I get the client IP using PHP?如何使用 PHP 获取客户端 IP?
【发布时间】:2013-05-09 23:11:33
【问题描述】:

我有一个带有 PHP 的网页,我正在尝试获取客户端 IP,但我得到的是服务器网关 IP 地址 (192.168.0.1)。

这是我在办公室的:

ISP ---> ISP 路由器 ---> 我的路由器(192.168.0.1) ----> (192.168.0.2)我的服务器。

我尝试了所有这些行,但我无法获得真正的 ip,只有 SERVER GATEWAY ip。

$_SERVER['HTTP_X_FORWARDED_FOR']
$_SERVER['HTTP_CLIENT_IP']
$_SERVER['HTTP_X_REAL_IP']
$_SERVER['GATEWAY_INTERFACE']
$_SERVER['SERVER_ADDR']
$_SERVER['SERVER_NAME']
$_SERVER['SERVER_SOFTWARE']
$_SERVER['SERVER_PROTOCOL']
$_SERVER['REQUEST_METHOD']
$_SERVER['REQUEST_TIME']
$_SERVER['QUERY_STRING']
$_SERVER['DOCUMENT_ROOT']
$_SERVER['HTTP_ACCEPT']
$_SERVER['HTTP_ACCEPT_CHARSET']
$_SERVER['HTTP_ACCEPT_ENCODING']
$_SERVER['HTTP_ACCEPT_LANGUAGE']
$_SERVER['HTTP_CONNECTION']
$_SERVER['HTTP_HOST']
$_SERVER['HTTP_REFERER']
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTPS']
$_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_HOST']
$_SERVER['REMOTE_PORT']
$_SERVER['SCRIPT_FILENAME']
$_SERVER['SERVER_ADMIN']
$_SERVER['SERVER_PORT'] 
$_SERVER['SERVER_SIGNATURE']
$_SERVER['PATH_TRANSLATED']
$_SERVER['SCRIPT_NAME']
$_SERVER['REQUEST_URI']
$_SERVER['PHP_AUTH_DIGEST']
$_SERVER['PHP_AUTH_USER'] 
$_SERVER['PHP_AUTH_PW']
$_SERVER['AUTH_TYPE']

以下变量是“未定义的”:

-HTTP_X_FORWARDED_FOR
-HTTP_CLIENT_IP
-HTTP_X_REAL_IP
-HTTPS
-REMOTE_HOST
-PATH_TRANSLATED
-PHP_AUTH_DIGEST
-PHP_AUTH_USER
-PHP_AUTH_PW
-AUTH_TYPE



编辑:尝试了“var_dump($_SERVER)”,但找不到客户端 IP 地址 :(

编辑2:我在谷歌上搜索了一下,我“找到了答案”。用户 Martin Hohenberg 说的是对的。在 NAT 过程中,标头被破坏,因此我的服务器无法读取原始 IP 地址。目前,如果不将服务器移到前面,我不知道解决此问题的可行方法。

【问题讨论】:

标签: php remote-client


【解决方案1】:

Similar question

试试

echo $_SERVER['REMOTE_ADDR'];

Read more

function getUserIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) //if from shared
    {
        return $_SERVER['HTTP_CLIENT_IP'];
    }
    else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   //if from a proxy
    {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        return $_SERVER['REMOTE_ADDR'];
    }
}

请查看阅读更多链接和问题链接

【讨论】:

  • 正如我所说,返回服务器网关 IP,而不是客户端 IP
  • @Redder 暗示您的服务器在某种 NAT 后面 - 这意味着 TCP 标头正在被重写,基本上失去了原始客户端的 IP
  • @Dasun - 我尝试了所有这些服务器变量,但我遇到了同样的问题。
  • @MartinHohenberg - 据我所知,每个路由器都会进行 NAT 以将公共网络转换为专用网络。那么为什么这适用于其他网络而不是这个网络呢?可能是路由器配置问题??
【解决方案2】:

如果您是从运行服务器的机器发出请求,那么$_SERVER['REMOTE_ADDR'] 显然会包含您自己的 IP 地址,即 192.168.0.1

【讨论】:

  • 我从外部网络发出请求,我得到了服务器的网关地址
猜你喜欢
  • 2013-06-22
  • 1970-01-01
  • 2021-07-07
  • 2021-09-15
  • 2012-03-31
  • 2013-07-07
  • 2014-10-10
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多