PHP如何获取用户的真实IP?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP如何获取用户的真实IP?相关的知识,希望对你有一定的参考价值。

我用的是阿里云的LSB+ECS,如果直接用 $_SERVER['REMOTE_ADDR']; 获取到的全部都是本地局域网IP,怎么才能获取到用户的真实IP呢? 求代码

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();
参考技术A /**
客户端IP
*/
function getClientIp()
if(getenv('HTTP_CLIENT_IP'))
$onlineip = getenv('HTTP_CLIENT_IP');
elseif(getenv('HTTP_X_FORWARDED_FOR'))
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
elseif(getenv('REMOTE_ADDR'))
$onlineip = getenv('REMOTE_ADDR');
else
$onlineip = $_SERVER['REMOTE_ADDR'];

return $onlineip;

一般都有用本回答被提问者和网友采纳
参考技术B 用Request.UserHostAddress可以得到用户IP追问

PHP

java如何获取用户真实的ip

百度上有两种方法

第一种

public static String getRemortIP(HttpServletRequest request)

if (request.getHeader("x-forwarded-for") == null)

return request.getRemoteAddr();


return request.getHeader("x-forwarded-for");



第二种
public static String getIpAddr(HttpServletRequest request)
String ip = request.getHeader("x-forwarded-for");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("Proxy-Client-IP");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
ip = request.getHeader("WL-Proxy-Client-IP");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
ip = request.getRemoteAddr();

if (ip.equals("0:0:0:0:0:0:0:1"))
ip = "本地";

return ip;

我想问一下是不是两种都可以。请说明可以的方式的具体这样写的原因。

还有网上还有一些说如果有代理,就怎样怎样,是什么意思?

  1、如果服务器如果没有采用反向代理,而且客户端没有用正向代理的话,那么可以获取客户端的真实IP地址request.getRemoteAddr()

  2、如果服务器如果没有采用反向代理,而且客户端有用正向代理的话,那么通过request.getRemoteAddr()获取客户端的IP地址是客户端 的代理服务器的地址,并不是客户端的真实地址,

  3、如果客户端使用的是多层代理的话,服务器获得的客户端地址是客户端的最外围代理服务器的地址如果服务器如果采用反向代理服务器,不管客户端采用的是何种方式访问服务器。

//获得客户端真实IP地址的方法一:
public String getRemortIP(HttpServletRequest request)   
    if (request.getHeader("x-forwarded-for") == null)   
        return request.getRemoteAddr();  
      
    return request.getHeader("x-forwarded-for");  
  
//获得客户端真实IP地址的方法二:
public String getIpAddr(HttpServletRequest request)   
    String ip = request.getHeader("x-forwarded-for");  
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
        ip = request.getHeader("Proxy-Client-IP");  
      
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
        ip = request.getHeader("WL-Proxy-Client-IP");  
      
    if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))   
        ip = request.getRemoteAddr();  
      
    return ip;  
参考技术A public String IP() throws IOException
String IP=null;
URL url = new URL("http://iframe.ip138.com/ic.asp");
URLConnection conn = url.openConnection();
conn.setRequestProperty(
"User-Agent",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15");
conn.setRequestProperty("Content-Type", "text/html");
conn.setRequestProperty("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
InputStream is = conn.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,
"GB2312"));
String line = null;
while ((line = br.readLine()) != null)
if (line.contains("您的IP是"))
// System.out.println(line);
int start = line.indexOf('[') + 1;
int end = line.indexOf(']');
IP=line.substring(start, end);


br.close();
return IP;


抓取网路使用的IP追问

什么来的?

追答

模拟上网讯号并抓取该网页所显示IP

追问

这个问题和我问的有关系吗?

追答

= ="
你不是要知道IP??
这个是抓到你真的使用来上网的IP,除非你使用的代理是直接使用模拟网路卡不然这个都会直接抓取到真实IP

以上是关于PHP如何获取用户的真实IP?的主要内容,如果未能解决你的问题,请参考以下文章

php获取用户真实IP和防刷机制

如何获取伪装ip下的真实ip地址

如何获取网站用户的真实IP

java如何获取用户真实的ip

如何获取用户的真实IP

PHP获取用户真实IP地址