PHP获取真实IP的一个可靠的方法
使用PHP近十年了,一直是用$_SERVER[‘REMOTE_ADDR’]获取IP的,也没察觉出有什么问题。最近有个项目,我把$_SERVER[‘REMOTE_ADDR’]加入到hash安全算法里去了,比如$hash = md5($_SERVER[‘REMOTE_ADDR’].$aaaa),发现同一个用户同一个设备hash值总是变化。跟踪信息才发现$_SERVER[‘REMOTE_ADDR’]值会隔断时间就变化。经过了解才发现了这个问题。没想到老司机了碰上这么个基础性的问题。把相对比较靠谱的一个获取真实IP的函数,贴出来,供自己和大家以后使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function getip() { static $ip = ''; $ip = $_SERVER['REMOTE_ADDR']; if(isset($_SERVER['HTTP_CDN_SRC_IP'])) { $ip = $_SERVER['HTTP_CDN_SRC_IP']; } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) { foreach ($matches[0] AS $xip) { if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) { $ip = $xip; break; } } } return $ip; } |