我仍然对这个主题感到困惑,希望得到关于如何通过PHP检查访问者IP地址的任何帮助和参考。
我知道在编写代码之前询问问题似乎有些懒惰,但现在我也正在搜索相关信息。希望有人能给出一般性的答案或一些阅读链接?
顺便说一下,当我们需要编写这样的功能时,需要考虑什么?
PS:非常感谢大家。这是启发性的争论。说实话,我更倾向于选择那些给答案带来了尊重而不是真相的答案。因为直到现在,我还不知道正确的答案。或许在我对该主题本身有一个扎实的理解之前,我需要更多年的学习。
我仍然对这个主题感到困惑,希望得到关于如何通过PHP检查访问者IP地址的任何帮助和参考。
我知道在编写代码之前询问问题似乎有些懒惰,但现在我也正在搜索相关信息。希望有人能给出一般性的答案或一些阅读链接?
顺便说一下,当我们需要编写这样的功能时,需要考虑什么?
PS:非常感谢大家。这是启发性的争论。说实话,我更倾向于选择那些给答案带来了尊重而不是真相的答案。因为直到现在,我还不知道正确的答案。或许在我对该主题本身有一个扎实的理解之前,我需要更多年的学习。
请参阅$_SERVER,特别是:
$_SERVER['REMOTE_ADDR'];
$_SERVER['REMOTE_ADDR']
只会返回代理服务器的 IP 地址,而不是客户机器的 IP 地址。这并不是非常可靠的。这可能是一个更好的解决方案:https://dev59.com/mUzSa4cB1Zd3GeqPpMLv#2505718但是,请注意获取 IP 地址永远不是完全可靠的:https://dev59.com/30rSa4cB1Zd3GeqPTyAT#1678748 - Mathias Bynens好的,justjoe,我看到你对这个参数感到困惑,我在其中起了很大的作用。
以下是更多的解释。
答案取决于任务。你有两个选择:
如果你只需要一个IP地址,你可以只使用REMOTE_ADDR而不使用其他任何参数。查看Web服务器的访问日志:只有一个IP地址,即REMOTE_ADDR。至少它能保证你得到一个有效的IP地址。在许多情况下,比如流量计数器,这是唯一可靠的方法。这是“如何获取IP地址”的通用答案。
如果你想记录一个可能更精确的地址,那么你可以记录多个地址,而不是一个。但是,你必须连同REMOTE_ADDR一起记录这些HTTP头信息,而不是替代它。这些地址有一些用处。但是你不能过分依赖它们。但是如果你关心的话,你可以从中挖掘一些信息。
FORWARDED_FOR头的唯一用途是当一个Web服务器配置错误时,将真实的IP地址放入此变量中。在这种情况下,它可以被用作IP地址。但是当然,这必须在每个特定的情况下手动完成,而不是作为一般建议。但无论如何,我会退出这样的Web服务器,因为它里面不能只有一个配置错误。
$ip = $_SERVER['REMOTE_ADDR']
$_SERVER['REMOTE_ADDR']
只会返回代理服务器的 IP 地址,而不是客户机器的 IP 地址。这并不是非常可靠的。这可能是一个更好的解决方案:https://dev59.com/mUzSa4cB1Zd3GeqPpMLv#2505718但是,请注意获取 IP 地址永远不是完全可靠的:https://dev59.com/30rSa4cB1Zd3GeqPTyAT#1678748 - Mathias Bynens$_SERVER ['REMOTE_ADDR']
只会返回代理服务器的IP地址,而不是客户机器的IP地址。这并不是非常可靠的。以下可能是更好的解决方案:function get_ip_address() {
foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key) {
if (array_key_exists($key, $_SERVER)) {
foreach (explode(',', $_SERVER[$key]) as $ip) {
$ip = trim($ip); // just to be safe
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false) {
self::$ip = $ip;
return $ip;
}
}
}
}
}
REMOTE_ADDR
以外使用其他东西都是不明智的,但你似乎只会简单地回应侮辱性言辞。我并不想引发宗教争论。我相信你有非常好的理由。我只是想找出这个原因是什么。 - Mike BREMOTE_ADDR
是不可欺骗的。它是TCP/IP协议在三次握手中确认的地址,以建立双向连接,因此您的服务器可以将某些内容发送回客户端。另一方面,HTTP标头由客户端设置,可以是任何内容。此外,您有什么理由查看代理后面的内容,您能获得什么?可能是一堆10.0.1.x
地址,这对您也没有什么帮助。 - deceze一般而言,与客户端相关的所有PHP信息都存储在$_SERVER变量中。因此,每当您想要查看特定信息时,请执行以下代码以查找相关信息:
echo "<pre>";
print_r($_SERVER);
echo "</pre>";
//or just
phpinfo(32);
$_SERVER['REMOTE_ADDR'] 是唯一可以获取的IP地址,尽管它可能不是“客户端地址”。
以下内容可达到目的。
$ip = $_SERVER['REMOTE_ADDR'];
echo "IP address is : " :.$ip;
http://third-party-url.com?ip=IP_ADDRESS
它会返回XML或数据数组。
你可以随后使用它来做任何你想做的事情。
这里有两个受欢迎的网站。 * 我的IP地址查询和地理定位 * SimpleGeo
还有很多类似的网站.. 也许其他人可以在这里添加它们。
只需在您的代码顶部使用此代码:
if (function_exists('apache_request_headers'))
{
$headers = apache_request_headers();
if (array_key_exists('X-Forwarded-For', $headers))
{
$ips = explode(',',$headers['X-Forwarded-For'],2);
$_SERVER["REMOTE_ADDR"]= trim($ips[0]);
}
}
它将确保在负载均衡应用程序中,$_SERVER["REMOTE_ADDR"]
始终保持正确的IP地址。