如何获取客户端IP地址

4

我尝试使用$_SERVER['REMOTE_ADDR']获取浏览网站的客户端IP地址,但我没有得到客户端的准确IP地址,请帮帮我...谢谢。


2
实际上这是做法。你说的“不是确切的IP”是什么意思? - JochenJung
REMOTE_ADDR会返回什么内容? - fabrik
3
我怀疑你是从路由器获取外部IP地址,而不是期望查看网站的机器的内部IP地址。 - Alex
有很多原因可能导致您没有得到预期的结果,其中任何一个、全部或没有都可能适用于您。我们需要了解有关您的应用程序部署的详细信息,例如正在使用哪个HTTP服务器,是否使用任何缓存或代理机制等。 - Nicholas Knight
我的客户端IP是10.173.88.22,但我收到的是164.100.6.102这个IP地址。 - user389055
@user389055:知道客户端的本地IP地址有什么优势? - Gumbo
4个回答

5
$_SERVER['REMOTE_ADDR'] 

这是你能得到的最好的翻译了。
客户端可以发送各种其他标头(如HTTP_FORWARDED_FOR等)- 有关完整概述,请参见此问题 - 但这些可以被客户端自由操纵,并且不能被视为可靠。

3

// 获取真实客户端IP

function getIP() {
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
        $ip = getenv("HTTP_CLIENT_IP");
    } else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) {
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    } else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
        $ip = getenv("REMOTE_ADDR");
    } else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) {
        $ip = $_SERVER['REMOTE_ADDR'];
    } else {
        $ip = "unknown";
    }
    return($ip);
}

1
服务器看到的 IP 地址是客户端的公网 IP 地址。如果他们在 NAT 路由器后面,他们在网络内部会有一个不同的地址。
如果在客户端机器上运行 ipconfig(Windows)或 ifconfig(类 Unix 系统),您将获得其本地 IP 地址。如果它在 192.168.x.x 或 10.x.x.x 范围内,则他们在 NAT 路由器后面,互联网将从不同的地址看到他们。

1
如果用户在代理后面,您将获得代理的IP地址。用户IP可能是以下之一(您需要检查两者): $_SERVER['HTTP_CLIENT_IP'] $_SERVER['HTTP_X_FORWARDED_FOR']
如果其中任何一个被设置,则用户在代理后面(除非他伪造了这些标头),您应该将它们用作源IP。 否则,请使用$_SERVER['REMOTE_ADDR']。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接