当前位置: 首页 > 编程笔记 >

通过PHP实现获取访问用户IP

裴楚青
2023-03-14
本文向大家介绍通过PHP实现获取访问用户IP,包括了通过PHP实现获取访问用户IP的使用技巧和注意事项,需要的朋友参考一下

在php中自带了一个非常的简单的获取IP地址的全局变量,很多初学都获取IP都使用它了,但是对于这些我们一般用法是满足了,但是对于要求高精度这个函数还是不行的。

这个是最简单的方法,对于开了透明代理之类的是没有办法的,如果内网访问也不能读取正确的外网IP,不过很省力就是了:

$ip = $_SERVER["REMOTE_ADDR"];

搞定~

上面方法用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址

要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。
但是如果客户端没有通过代理服务器来访问,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值将是空的。

else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");

表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不为空(即客户端使用代理服务器的情况下),则变量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真实IP值。

如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值为空(即没有使用代理服务器),则不会执行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");这一行语句。

这种情况下已经确认客户端没有使用代理服务器,从而通过

else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");

这两行语句获得客户端的IP地址也是真实的IP地址,根据经验得出

function getIP()
{
  static $realip;
  if (isset($_SERVER)){
    if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){
      $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
      $realip = $_SERVER["HTTP_CLIENT_IP"];
    } else {
      $realip = $_SERVER["REMOTE_ADDR"];
    }
  } else {
    if (getenv("HTTP_X_FORWARDED_FOR")){
      $realip = getenv("HTTP_X_FORWARDED_FOR");
    } else if (getenv("HTTP_CLIENT_IP")) {
      $realip = getenv("HTTP_CLIENT_IP");
    } else {
      $realip = getenv("REMOTE_ADDR");
    } 
  }
  return $realip;
}

另外如果我们想获取更精准的使用第三方是一个不错的方法哦

function get_onlineip() {
  $ch = curl_init('http://www.ip138.com/ip2city.asp');
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $a = curl_exec($ch);
  preg_match('/[(.*)]/', $a, $ip);
  return $ip[1];
 }

这样不管理代理还是什么都可以判断IP地址哦

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 需要使用passport为laravel构建api系统。在拉威尔。2 Oauth 2集成有一个单独的类授权程序,用于执行通过访问令牌获取用户数据的操作方式 但在passport中,没有基于访问令牌获取用户详细信息的单独方法。有人能帮我吗?

  • 本文向大家介绍php实现获取及设置用户访问页面语言类,包括了php实现获取及设置用户访问页面语言类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现获取及设置用户访问页面语言类,分享给大家供大家参考。具体分析如下: 该实例User Language Class 获取/设置用户访问的页面语言,如果用户没有设置访问语言,则读取Accept-Language。根据用户选择的语言显示对应的

  • 我有一个Web角前端,API网关受Cognito和Lambda保护,用于其他业务用例。登录和授权工作正常。我正在使用AWS Javascript SDK进行授权。像https://s3.amazonaws.com/solutions-reference/mobile-backend/latest/mobile-app-backend.pdf 在我的lambda中,我需要获得其他用户的信息,如名字、

  • 我正在写一个小小的短信网关,供几个项目使用, 我实现了laravel passport身份验证(客户端凭据授予令牌) 然后,我向api中间件组添加了: 逻辑工作正常,现在在我的控制器中,我需要让客户机与有效令牌关联。 routes.php 出于明显的安全原因,我无法将客户端id与消费者请求一起发送,例如,

  • 我如何为我自己的用户获取Spotify访问令牌,而不是从Postman处获取? 我想使用邮递员从Spotify获取访问令牌(无需之前的手动登录)。 如果这很复杂,我会接受先手动登录,然后再从Postman获取令牌。 < li >要获得访问令牌(将在我自己的Postman请求中进一步使用),我必须在登录Spotify开发者网站时手动获得一个。 因此,我想直接从Postman获得它,在那里我可以立即在

  • 我有一个关于Keycloak和获取访问令牌的问题。 我们的设置如下:·用户在Keycloak中创建和维护。资源、策略和权限也在Keycloak中维护 >我们如何通过只知道用户名来为用户获取访问令牌? >有没有为这样的用户获取访问令牌的解决方案?