
error_reporting(0)
header("content-type:text/htmlcharset=utf-8")
$conn=mysql_connect("127.0.0.1","root","qaz123")
if (!$conn)
{
die('Could not connect: ' . mysql_error())
}
mysql_select_db("test", $conn)
mysql_query("set names utf-8")
$ip = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"]
$ip = ($ip) ? $ip : $_SERVER["REMOTE_ADDR"]
$time=time()
mysql_query("INSERT INTO visit (ip, time) values('$ip','$time')")
/*
CREATE TABLE `visit` (
`id` int NOT NULL AUTO_INCREMENT ,
`ip` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
CHECKSUM=0
DELAY_KEY_WRITE=0
*/
大家一般都是用$_SERVER['REMOTE_ADDR']来获取用户IP,但是如果使用了反向代理的,HTTP头中REMOTE_ADDR就不是用户的地址,反而是上一级代理的地址了。
经过我的研究有两种方法来获取用户的真实外网IP。
方法一:curl
复制代码代码如下:
function get_onlineip() {
$ch = curl_init('http://www.ip138.com/ip2city.asp')
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)
$a = curl_exec($ch)
preg_match('/\[(.*)\]/', $a, $ip)
return $ip[1]
}
方法二:$_SERVER['HTTP_X_FORWARDED_FOR']来获取相应的地址
复制代码代码如下:
function get_onlineip() {
$onlineip = ''
if(getenv('HTTP_CLIENT_IP') &&strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$onlineip = getenv('HTTP_CLIENT_IP')
} elseif(getenv('HTTP_X_FORWARDED_FOR') &&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR')
} elseif(getenv('REMOTE_ADDR') &&strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$onlineip = getenv('REMOTE_ADDR')
} elseif(isset($_SERVER['REMOTE_ADDR']) &&$_SERVER['REMOTE_ADDR'] &&strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$onlineip = $_SERVER['REMOTE_ADDR']
}
return $onlineip
}
php获取用户真实ip的方法:方法1:
//获取REMOTE_ADDR属性,直接可以得到ip
$ip = $_SERVER["REMOTE_ADDR"]
echo $ip
方法2:
//从Server中获取HTTP_VIA,如果获取到就用HTTP_X_FORWARDED_FOR的值替换,如果获取不到就取REMOTE_ADDR的值。
$user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] :
$_SERVER["REMOTE_ADDR"]
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"]
echo $user_IP
方法3:
function getRealIp()
{
$ip=false//初始化ip为false
if(!empty($_SERVER["HTTP_CLIENT_IP"])){ //如果HTTP_CLIENT_IP不为空
$ip = $_SERVER["HTTP_CLIENT_IP"]//获取HTTP_CLIENT_IP的值
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { //如果HTTP_X_FORWARDED_FOR不为空
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR'])
//把HTTP_X_FORWARDED_FOR的值用,分割后存放数组ips
if ($ip) { array_unshift($ips, $ip)$ip = FALSE}//遍历处理
for ($i = 0$i <count($ips)$i++) {
if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
$ip = $ips[$i]//获得真实ip
break
}
}
}
return ($ip ? $ip : $_SERVER['REMOTE_ADDR'])
}
echo getRealIp()
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)