php如何取到客户端的真实ip的
最近对php项目获取真实ip的部分感兴趣,于是想看一看。项目的架构是这样的:客户端--->阿里云clb--->nginx--->php-fpm
先看现象,php代码中是直接通过$_SERVER['REMOTE_ADDR']
取到了真实的ip的。
第一步
先在nginx所在机器抓包,发现请求的包是这样的:
11:01:12.694050 IP 100.122.16.123.29652 > iZm5e57xg6txyi26htw99w1.http: Flags [P.], seq 0:730, ack 1, win 55, options [nop,nop,TS val 3305100269 ecr 794613098], length 730: HTTP: GET /test
100.122.16.123是阿里云的clb,也就是说数据包到达nginx时,只会取到100.122.16.123这个ip,nginx如何拿到真实ip呢?通过wireshark视图化数据包可以看到,原来clb在代理过程中给请求的header加上了X-Forwarded-For,这里面有客户端的真实ip。
第二步
nginx是如何把ip传给php-fpm进程的呢,在nginx的配置文件发现了这个:fastcgi_param REMOTE_ADDR $remote_addr;
这也就是php-fpm可以通过$_SERVER['REMOTE_ADDR']
取到真实的ip的原因了。但是$remote_addr这个变量又是怎么来的呢?在nginx的配置文件又发现了这个:
set_real_ip_from 100.64.0.0/10;
real_ip_header X-Forwarded-For;
nginx会通过这个配置读取名为X-Forwarded-For的header头,然后赋值给$remote_addr。
参考资料
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: