Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中编写检查访问者IP地址的功能?_Php_Proxy_Ip Address - Fatal编程技术网

如何在PHP中编写检查访问者IP地址的功能?

如何在PHP中编写检查访问者IP地址的功能?,php,proxy,ip-address,Php,Proxy,Ip Address,我仍然对这个问题感到困惑,并寻求关于如何通过PHP检查访问者IP地址的帮助和参考 我知道,在尝试编写代码来显示某个内容之前,询问某个内容似乎很懒散,但现在,我也在谷歌上寻找它。希望有人能给出大致的答案或一些链接阅读 顺便说一句,当我们必须编写这样的功能时,应该考虑什么 PS:非常感谢大家。这是很有启发性的论点。坦率地说,我选择答案更多的是出于尊重,而不是因为其中的真相。因为直到现在我还不知道正确的答案。也许我需要更多年的学习才能真正理解这个主题本身。如果您的客户机正在代理服务器上冲浪,那么$\u

我仍然对这个问题感到困惑,并寻求关于如何通过PHP检查访问者IP地址的帮助和参考

我知道,在尝试编写代码来显示某个内容之前,询问某个内容似乎很懒散,但现在,我也在谷歌上寻找它。希望有人能给出大致的答案或一些链接阅读

顺便说一句,当我们必须编写这样的功能时,应该考虑什么


PS:非常感谢大家。这是很有启发性的论点。坦率地说,我选择答案更多的是出于尊重,而不是因为其中的真相。因为直到现在我还不知道正确的答案。也许我需要更多年的学习才能真正理解这个主题本身。

如果您的客户机正在代理服务器上冲浪,那么
$\u server['REMOTE\u 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;
    }
   }
  }
 }
}
这在以前的堆栈溢出中已经讨论过。请参阅。上述代码是该问题公认答案的优化版本。

但是,请注意,获取IP地址从来都不是完全可靠的:

请特别参阅:

$_SERVER['REMOTE_ADDR'];

一般回答:PHP对客户端的所有了解都存储在$\u服务器变量中。 因此,每当您希望了解特定信息时,请执行以下代码,以查看是否可以找到相关信息:

echo "<pre>";
print_r($_SERVER);
echo "</pre>";
//or just
phpinfo(32);
echo”“;
打印服务器($);
回声“;
//或者只是
phpinfo(32);

$\u SERVER['REMOTE\u ADDR']是您可以获取的唯一IP地址,尽管它可能不是“客户端地址”

要获取用户IP地址,您应该使用

$ip = $_SERVER['REMOTE_ADDR'];

echo "IP address is : " :.$ip;

以下内容可用于此目的

http://third-party-url.com?ip=IP_ADDRESS

我建议您使用第三方IP地址来计算地理转换器的位置。因为您不必占用数据库空间。。准确性和查询

你需要做的就是

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]);
    }
}
它会返回XML或数据数组

以后你可以用它做任何你想做的事

这里有两个很受欢迎的网站。 * *


有很多这样的网站。。也许其他人可以在这里添加它们。

好的,justjoe,我看到你对这一论点感到困惑,我也参与其中

再给你解释一下

答案取决于任务。您有两种选择:

如果您只需要一个IP地址,则只能使用REMOTE_ADDR,而不能使用其他地址。看看web服务器的访问日志:只有一个IP地址,它是远程地址。至少它保证你有一个有效的IP地址。在很多情况下,像交通计数器一样,它是你唯一可以依赖的东西。这是“如何获得IP地址”问题的一般答案

如果你想记录一个可能更精确的地址,那么,没有人禁止你记录多个地址,不是一个。但当然,您必须将这些HTTP头与远程地址一起记录,而不是代替它。这样一大堆地址有一定的用处。但你不能过分依赖它。但如果你愿意,你可以从中挖掘一些信息


FORWARDED_for标头的唯一情况是配置错误的Web服务器,它将实际IP地址放入该变量中。在这种情况下,它可以用作IP地址。但当然,在每一种特殊情况下,都必须手动完成,而不是像一般建议那样。但无论如何,我还是会退出这样一个Web服务器,因为它不可能只有一个配置错误。

只需在代码顶部使用以下内容:


它将确保
$\u SERVER[“REMOTE\u ADDR”]
始终在负载平衡器应用程序上保留正确的IP地址。

@Mike最好不要链接该代码。@Col因为。。。?不管被接受的答案是什么,我们能同意实际问题几乎是一样的吗?因为每个投赞成票的人都不知道答案。任何只返回一个IP地址而该地址不是远程地址的代码都是错误的。因为PHP拥有的唯一IP地址(就TCP/IP协议而言)是远程地址。其余的只是HTTP头如果您的客户端正在代理服务器上冲浪,那么
$\u server['REMOTE\u ADDR']
只返回代理服务器的IP地址,而不是客户端机器的IP地址。这不太可靠。这可能是一个更好的解决方案:但是,请注意,获取IP地址从来都不是完全可靠的:@Mathais Bynens:As或比您可能尝试检测的任何HTTP头都更可靠。而且它不需要大量的代码。如果您的客户端正在代理服务器上冲浪,那么
$\u server['REMOTE\u ADDR']
只返回代理服务器的IP地址,而不是客户端机器的IP地址。这不太可靠。这可能是一个更好的解决方案:但是,请注意,获取IP地址从来都不是完全可靠的:@Mathias好吧,你能最终决定哪一个“不太可靠”吗?当用户使用代理服务器时,HTTP报头如何比IP地址更可靠呢。函数getRealIpAddr(){if(!empty($_服务器['HTTP_客户端\u IP'])//检查来自共享internet的IP{$IP=$_服务器['HTTP_客户端\u IP'];}elseif(!empty($_服务器['HTTP_X_转发给'])//检查IP是否从代理服务器传递{$IP=$_服务器['HTTP_X_转发给']}否则{$IP=$$_服务器['REMOTE ADDR']}返回$ip;}此函数首先尝试获取客户端计算机的直接ip地址,如果不可用,则使用HTTP_X_forwarded_for尝试转发ip地址。这不是您选择的ip地址,但是HTTP头。@Col称代码愚蠢和说它不能回答问题是两件完全不同的事情。@Mathias 1。像HTTP头一样容易欺骗IP地址。2.IP地址总是比HTTP头更可靠。3.这段代码尝试了,但失败了。@Col有多少种方法可以重新表述相同的内容?我要你解释为什么会这样
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]);
    }
}