关于如何使用laravel获取客户端 IP 地址的两种方法

核心提示1 laravel 自带方法获取客户端 ipdd->ip);var_dump->getClientIp);但是,这是在没有代理的情况下,有时候我们的业务使用了反向代理、负载均衡、cdn 加速等等,我们就要设置信任的代理 IP。修改 app\

1 laravel 自带方法获取客户端 ip

dd->ip);var_dump->getClientIp);

但是,这是在没有代理的情况下,有时候我们的业务使用了反向代理、负载均衡、cdn 加速等等,我们就要设置信任的代理 IP。

修改 appHttpMiddlewareTrustProxies.php 中的 $proxies

protected $proxies = [    '192.168.1.1/24',//你信任的代理IP,支持IP段。];

如果你不清楚代理服务器 IP,或者 IP 会一直变动。可以设置信任所有代理。

网段 192.168.1.0/24 是什么意思?

192.168.1.0/24 表示网段是 192.168.1.0,子网掩码是 24 位,子网掩码为:255.255.255.0,

用二进制表示为:11111111 11111111 11111111 00000000 ,

这里为什么是 24 呢,就是因为子网掩码里面的前面连续的 “1” 的个数为 24 个,一定要连续的才行。

192.168.1.0/28 表示的意思是网段是 192.168.1.0,子网掩码为:255.255.255.240,

用二进制表示为:11111111 11111111 11111111 11110000。

这时候你也许就疑惑了,就是 24 和 28 两个字不一样,为什么网段是一样的呢?

24 位说明网络位是 24 位,那么主机位就是 32-24=8 位了,则子网的 IP 个数是 254 个,即是从 00000001 到 11111110.

28 位说明网络位是 28 位,那么主机位 4 位,则子网的 IP 个数是 14 个,即是从 00000001 到 00001110.

protected $proxies = ‘**’;

// 自定义函数获取客户端IP< phpnamespace AppHttpControllers;class TestController extends Controller{    public function ip    { dd);    }        private function getClientIp    { if ) {     $ip = getenv; } if ) {     $ip = getenv; } elseif ) {     $ip = getenv;     $ips = explode;     $ip = $ips[0]; } elseif ) {     $ip = getenv; } else {     $ip = '0.0.0.0'; } return $ip;    }}

getenv — 获取环境变量的值

getenv — 获取环境变量的值

var_dump);//得出//string"/usr/local/node/bin:/usr/local/jdk-12.0.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

HTTP_CLIENT_IP

HTTP_CLIENT_IP 是代理服务器发送的 HTTP 头。如果是 “超级匿名代理”,则返回 none 值。同样,REMOTE_ADDR 也会被替换为这个代理服务器的 IP。

$_SERVER [‘HTTP_CLIENT_IP’]; // 代理端的

HTTP_X_REAL_IP

nginx 代理模式下,获取客户端真实 IP

$_SERVER [‘HTTP_X_REAL_IP’]; // 得到的都是客户端的地址

在 nginx 中设置:

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

后端程序可以从 Server 变量 HTTP_X_REAL_IP 和 HTTP_X_FORWARDED_FOR 中获取用户的 ip 地址。

HTTP_X_REAL_IP 的值是 nginx 得到的用户 REMOTE_ADDR。

HTTP_X_FORWARDED_FOR

$_SERVER [‘HTTP_X_FORWARDED_FOR’]; // 用户是在哪个 IP 使用的代理

一、没有使用代理服务器的情况:

REMOTE_ADDR = 您的 IP

HTTP_VIA = 没数值或不显示

HTTP_X_FORWARDED_FOR = 没数值或不显示

二、使用透明代理服务器的情况:Transparent Proxies

REMOTE_ADDR = 最后一个代理服务器 IP

HTTP_VIA = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。

三、使用普通匿名代理服务器的情况:Anonymous Proxies

REMOTE_ADDR = 最后一个代理服务器 IP

HTTP_VIA = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

隐藏了您的真实 IP,但是向访问对象透露了您是使用代理服务器访问他们的。

四、使用欺骗性代理服务器的情况:Distorting Proxies

REMOTE_ADDR = 代理服务器 IP

HTTP_VIA = 代理服务器 IP

HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机 IP 代替您的真实 IP 欺骗它。

五、使用高匿名代理服务器的情况:High Anonymity Proxies

REMOTE_ADDR = 代理服务器 IP

HTTP_VIA = 没数值或不显示

HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。

REMOTE_ADDR

如果不想获取代理 ip 需要对 NGINX 进行设置。

$_SERVER [‘REMOTE_ADDR’]; // 访问端IP

表示发出请求的远程主机的 IP 地址,remote_addr 代表客户端的 IP,但它的值不是由客户端提供的,而是服务端根据客户端的 ip 指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的 web 服务器就会把 remote_addr 设为你的机器 IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样 web 服务器就会把 remote_addr 设为这台代理机器的 IP。

x_forwarded_for

简称 XFF 头,它代表客户端,也就是 HTTP 的请求端真实的 IP,只有在通过了 HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web 服务器就不知道你的真实 IP 了,为了避免这个情况,代理服务器通常会增加一个叫做 x_forwarded_for 的头信息,把连接它的客户端 IP 加到这个头信息里,这样就能保证网站的 web 服务器能获取到真实 IP。

格式一般为:

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3

代表 请求由 1.1.1.1 发出,经过三层代理,第一层是 2.2.2.2,第二层是 3.3.3.3,而本次请求的来源 IP4.4.4.4 是第三层代理。

场景 1

是很简单的场景,Nginx Proxy 直接把请求往后转发,没有做任何处理

Nginx Proxy192.168.107.107 nginx.conflocation /test {    proxy_pass http://192.168.107.112:8080;}192.168.107.112 nginx.conflocation /test {    proxy_pass http://192.168.107.114:8080;}Nginx Proxy就是简单的把请求往后转发。Nginx Backend192.168.107.114 nginx.conflocation /test {    default_type text/html;    charset gbk;    echo "$remote_addr || $http_x_forwarded_for";}

Nginx Backend 输出客户端 IP 和 X F o r w a r d e d F o r 请 求 头 和 X-Forwarded-For 请求头和 XForwardedFor 请求头,当访问服务时输出结果如下所示:

192.168.107.112 ||

分析

1.$remote_addr 代表客户端 IP,当前配置的输出结果为最后一个代理服务器的 IP,并不是真实客户端 IP;

2. 在没有特殊配置情况下,X-Forwarded-For 请求头不会自动添加到请求头中,即 Nginx Backend 的 $http_x_forwarded_for 输出为空。

3 PHP 判断 ip 范围

判断 192.168.1.127 是否在 的范围

//定义变量    注释$ip_start = get_iplong;    起始ip$ip_end = get_iplong;    结束ip$ip = get_iplong;    判断的ip//可以这样简单判断  if{      echo 'IP在此范围内';  }else{      echo 'IP不在此范围';  }    function get_iplong{           return bindec));  }

4 获取客户端 ip 方法

< phpnamespace AppHttpControllers;use IlluminateHttpRequest;class TestContainer extends Controller{    # 获取客户端ip    public function containers    { if ) {     $ip = getenv; } else if ) {     $ip = getenv; } else if ) {     $ip = getenv; } else if ) {     $ip = getenv; } else if ) {     $ip = getenv; } else {     $ip = $_SERVER["REMOTE_ADDR"]; } return $ip;    }}

 
友情链接
鄂ICP备19019357号-22