因为克日需要几个小项目上CDN,但上CDN的同时,要获取到用户的真实IP地点。固然网上有许多关于网站在CDN加快的环境下,PHP获取用户真实IP地点的要领,但总觉的不行靠,照旧本身测试一下最好。
PHP超全局变量$_SERVERPHP超全局变量$_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']; } } ?>函数挪用要领: