前几天写一个项目,需要用到获取微信客户端的IP,因为我用的是ThtinkPHP5,ThtinkPHP5有个内置函数直接调用就行:
<?php
use think\Request;
$uip = Request::instance()->ip();
dump($uip);
但是得出的结果到让我出乎意料,获取到的竟然不是我想要的准确IP是个代理IP,这尼玛抠脚了,有时候甚至获取到两个IP。
这时候我猜测是不是通过QQ微信访问的时候他会进行IP代理,于是就找了一个网上的通用方法(PS:我懒,所以不自己写,而且造重复的轮子也没必要!)。下面贴代码
//不同环境下获取真实的IP
function get_ip(){
//判断服务器是否允许$_SERVER
if(isset($_SERVER)){
if(isset($_SERVER[HTTP_X_FORWARDED_FOR])){
$realip = $_SERVER[HTTP_X_FORWARDED_FOR];
}elseif(isset($_SERVER[HTTP_CLIENT_IP])) {
$realip = $_SERVER[HTTP_CLIENT_IP];
}else{
$realip = $_SERVER[REMOTE_ADDR];
}
}else{
//不允许就使用getenv获取
if(getenv("HTTP_X_FORWARDED_FOR")){
$realip = getenv( "HTTP_X_FORWARDED_FOR");
}elseif(getenv("HTTP_CLIENT_IP")) {
$realip = getenv("HTTP_CLIENT_IP");
}else{
$realip = getenv("REMOTE_ADDR");
}
}
return $realip;
}
运行之后还是获取不到用户的真实IP,大概看了一下网上的方法基本同出一辙,都没有解决我的问题。没办法只好自己动手了,下面贴下代码。
/**
* 获取客户端IP
* @return [type] 返回IP地址信息
*/
function getRealIp()
{
static $realip;
if (isset($_SERVER)) {
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$realip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$realip = $_SERVER["HTTP_CLIENT_IP"];
} else {
$realip = $_SERVER["REMOTE_ADDR"];
}
} else {
if (getenv("HTTP_X_FORWARDED_FOR")) {
$realip = getenv("HTTP_X_FORWARDED_FOR");
} else if (getenv("HTTP_CLIENT_IP")) {
$realip = getenv("HTTP_CLIENT_IP");
} else {
$realip = getenv("REMOTE_ADDR");
}
}
if (strpos($realip, ',') === false) {
$sUserIp = $realip;
} else {
$arrUserIp = explode(',', $realip);
$sUserIp = $arrUserIp[0];
}
return $sUserIp;
}
这下子完美解决问题 获取真实IP成功!
原创文章 未经许可 禁止搬运!
6 条评论
感谢老哥的教程
前几次遇到过原来是Tp的问题 我还以为就我这样呢。。。
这我也不能确定是不是TP的问题
WP的话可以直接获取但TP不行 可能是TP的类写的不全吧
对WP的话可以直接获取
学到了