在项目中,经常会有记录浏览日志的时候,同时需要记录客户端真实ip,主要判断客户端是否使用代理的情况
1、php中判断和获取
相关函数介绍:
1、$_SERVER和getenv的区别:getenv不支持IIS的isapi方式运行的php
2、HTTP_CLIENT_IP:可通过http头伪造, 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
3、HTTP_X_FORWARDED_FOR:可通过http头伪造
4、REMOTE_ADDR:可能是用户真实IP也可能是代理IP,是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
5、$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
6、$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
7、$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)
示例:
//记录浏览某个页面的日志
function addLog(){
$ads = Input::get('ads');
$ads = htmlspecialchars(($ads));
$aVisitlog = array(
'ads' => $ads,
'page_id' => Input::get('page_id'),
'ip' => this->ip(),
'created_at' => date('Y-m-d H:i:s' , time())
);
$oVisit = new VisitLog($aVisitlog);
$oVisit->save();
}
//用户所在IP--客户端
function ip(){
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')){
$ip = getenv('HTTP_CLIENT_IP');
}elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')){
$ip = getenv('HTTP_X_FORWARDED_FOR');
}elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')){
$ip = getenv('REMOTE_ADDR');
}elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')){
$ip = $_SERVER['REMOTE_ADDR'];
}
return preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : 'unknown';
}
2、js中判断和获取
<script>
function browserRedirect(url) {
var sUserAgent = navigator.userAgent.toLowerCase();
var bIsIpad = sUserAgent.match(/ipad/i) == "ipad";
var bIsIphoneOs = sUserAgent.match(/iphone os/i) == "iphone os";
var bIsMidp = sUserAgent.match(/midp/i) == "midp";
var bIsUc7 = sUserAgent.match(/rv:1.2.3.4/i) == "rv:1.2.3.4";
var bIsUc = sUserAgent.match(/ucweb/i) == "ucweb";
var bIsAndroid = sUserAgent.match(/android/i) == "android";
var bIsCE = sUserAgent.match(/windows ce/i) == "windows ce";
var bIsWM = sUserAgent.match(/windows mobile/i) == "windows mobile";
if ((bIsIpad || bIsIphoneOs || bIsMidp || bIsUc7 || bIsUc || bIsAndroid || bIsCE || bIsWM) ){
window.location.href=url;
}
}
$(document).ready(function(){
var thisId = window.location.hash;
if(thisId != "" && thisId != undefined){
var url = '/mobile/want';
browserRedirect(url);
}else{
var url = '/mobile';
browserRedirect(url);
}
});
</script>