开启CDN后,PHP获取用户真实IP的要领

因为克日需要几个小项目上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加快的网站根目次下面,并在欣赏器中以网址的方法打开。

代码:

<?php print_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" 元素的值

代码:

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

函数代码:

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

<?php function 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();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/9018.html