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; }}

