百度云、阿里云、开启CDN后,PHP获取用户真实IP的方法

  • 时间:
  • 浏览:173
  • 来源:无双科技

最近网站上CDN,但上CDN的同时,要获取到用户的真实IP地址。虽然网上有很多关于网站在CDN加速的情况下,PHP获取用户真实IP地址的方法,但总觉的不可靠,还是自己测试一下最好。

百度云、阿里云、开启CDN后,PHP获取用户真实IP的方法

PHP超全局变量$_SERVER

PHP超全局变量$_SERVER,是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组,这个数组中也包含了用户的请求的真实IP址址,所以我们可以利用它在使用各种cdn加速网站上进行测试。

在php中,一般都是通过以下代码来获取真实IP地址,但在CDN下,此代码获取到的IP只是CDN最近一个节点的IP,并不是真实的用户IP

<?php$_SERVER['REMOTE_ADDR'];?>

复制

编写一个如下代码的PHP文件,并命名为 ceshi.php 并放到使用CDN加速的网站根目录下面,并在浏览器中以网址的方式打开。

代码:

<?phpprint_r($_SERVER);?>

复制

以下是使用各个CDN加速后,打印出的结果,我们只列出含有真实IP地址的部份与 'REMOTE_ADDR' 部份

百度CDN打印结果:

Array( [HTTP_X_FORWARDED_FOR] => 119.164.27.53,123.234.0.103,27.221.124.94[HTTP_X_REAL_IP] => 119.164.27.53[REMOTE_ADDR] => 150.138.138.169.........)

复制

注意:

119.164.27.53 为我自己的真实IP,所以在百度CDN下打印出来的数组,只有 [HTTP_X_FORWARDED_FOR] 与 [HTTP_X_REAL_IP]  包含了真实的IP地址.

阿里CDN打印结果:

Array([HTTP_ALI_CDN_REAL_IP] => 119.164.27.53[HTTP_X_FORWARDED_FOR] => 119.164.27.53[REMOTE_ADDR] => 115.124.31.68.........)

复制

在阿里CDN中,只有 [HTTP_ALI_CDN_REAL_IP] 与 [HTTP_X_FORWARDED_FOR]  包含了真实的IP地址。

七牛CDN打印结果:

Array([HTTP_ALI_CDN_REAL_IP] => 119.164.27.53[HTTP_X_FORWARDED_FOR] => 119.164.27.53[REMOTE_ADDR] => 182.92.246.161.........)

复制

在七牛CDN下,打印的结果 [HTTP_ALI_CDN_REAL_IP]  和 [HTTP_X_FORWARDED_FOR]  中含有真实的IP地址

吐槽一下:七牛与阿里CDN在打印的结果,在某种程序上来说很是相似。

又拍云CDN打印结果:

Array([HTTP_X_FORWARDED_FOR] => 119.164.27.53[HTTP_X_REAL_IP] => 119.164.27.53[REMOTE_ADDR] => 150.138.216.79.........)

复制

在又拍云CDN下,打印结果,[HTTP_X_FORWARDED_FOR]  与  [HTTP_X_REAL_IP]  含有真实的IP地址。

未使用CDN关于IP字段

Array([REMOTE_ADDR] => 119.164.27.53)

复制

在未使用CDN的情况下,只有 “[REMOTE_ADDR]”包含了真实的IP地址,以上几家列出的 [HTTP_X_FORWARDED_FOR]  与  [HTTP_X_REAL_IP] 并未出现。

几家CDN打印结果分析:

通过对比使用以上几家CDN网站中,php文件打印结果,我们可以总结出以下三点:

1、在使用CDN时,$_SERVER变量中就会含有“HTTP_X_FORWARDED_FOR”元素,并且它里面含有用户的真实IP地址,

2、未使用CDN时,$_SERVER变量中不会出现“HTTP_X_FORWARDED_FOR”元素

3、百度CDN下,“HTTP_X_FORWARDED_FOR”元素中是多个IP地址,并用英文逗号分开,第一个为用户的真实IP地址。

PHP获取网站使用CDN加速下用户真实的IP地址代码

我们可以通过判断$_SERVER数组变量中是否含有“HTTP_X_FORWARDED_FOR”元素来判断,网站是否使用CDN加速,如果使用了CDN加速并反回用户的真实IP,如果没实用就返回 “REMOTE_ADDR" 元素的值

代码:

<?phpif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){//为了兼容百度的CDN,所以转成数组$arr = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);echo $arr[0];}else{echo $_SERVER['REMOTE_ADDR'];}?>

复制

函数代码:

如果你想在PHP的文件中多次调用以上代码,我们把可以把它封装成一个函数,如下

<?phpfunction GetUserIP(){if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){//为了兼容百度的CDN,所以转成数组$arr = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);return $arr[0];}else{return $_SERVER['REMOTE_ADDR'];}}?>

复制

函数调用方法:

echo GetUserIP();

猜你喜欢

请求百度开发平台接口报错解决方案,282004 invalid parameter(s) 及

请求百度开发平台接口报错解决方案,282004 invalid parameter(s) 及'error_code': 282131 'error_msg': 'input text too long'

因为百度开发平台返回的数据都为gbk编码,而json_decode只能转utf-8编码的数据;使用iconv()函数转为utf-8编码;{'error_code':282131

2020-08-07

基于轻量级php搜索sphider站内搜索安装说明

基于轻量级php搜索sphider站内搜索安装说明

安装1.解压缩文件,然后将它们复制到服务器,例如,复制到/home/youruser/public_html/sphider(后称为[path_of_sphider])。2.在

2020-08-06

如何使用chrome浏览器模拟微信访问网页?

如何使用chrome浏览器模拟微信访问网页?

APP、微信小程序开发时,我们经常需要使用电脑模拟微信访问,今天就教你如何使用谷歌、360浏览器的F12功能模拟微信访问网页。第一步:使用谷歌浏览器打开网页,按下F12或FN+

2020-08-04

php QRcode::png图片生成base64_encode后图片无法显示,暗中77u/ BOM头,让你猝不及防

php QRcode::png图片生成base64_encode后图片无法显示,暗中77u/ BOM头,让你猝不及防

最近做了一个支付宝的扫码支付功能,网上参考稳献一大篇,马上搬砖上码,功夫不付有心人,很快就OK了,上线服务器测试,既然无法显示二维码,以下是生成的二维码data:image/p

2020-07-31

深圳网站建设扫码支付功能升级维护