鍍金池/ 問答/PHP/ 請(qǐng)問下,用PHP獲取瀏覽當(dāng)前用戶的公網(wǎng)IP地址,用什么方法啊?

請(qǐng)問下,用PHP獲取瀏覽當(dāng)前用戶的公網(wǎng)IP地址,用什么方法啊?

請(qǐng)問下,用PHP獲取瀏覽當(dāng)前用戶的IP地址,用什么方法啊?
我查了一下,都說是用$_SERVER['REMOTE_ADDR'],但是這個(gè)獲取的結(jié)果并不是公網(wǎng)IP呀.

回答
編輯回答
墨小白

$_SERVER['REMOTE_ADDR'] 獲取的是瀏覽當(dāng)前用戶的ip地址,也就是服務(wù)器獲取訪問客戶端的ip
如果是使用本地或局域網(wǎng)測(cè)試肯定就不是了公網(wǎng)ip地址了

2017年5月16日 03:57
編輯回答
空白格

public function ip($type = 0, $adv = true)

{
    $type      = $type ? 1 : 0;
    static $ip = null;

    if (null !== $ip) {
        return $ip[$type];
    }

    if ($adv) {
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown', $arr);
            if (false !== $pos) {
                unset($arr[$pos]);
            }
            $ip = trim(current($arr));
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }

    // IP地址合法驗(yàn)證
    $long = sprintf("%u", ip2long($ip));
    $ip   = $long ? [$ip, $long] : ['0.0.0.0', 0];

    return $ip[$type];
}

直接拿去用

2017年11月28日 10:41
編輯回答
護(hù)她命

依次檢測(cè)以下請(qǐng)求頭,如果有值就返回

  1. REMOTE_ADDR
  2. X-FORWARDED-FOR
  3. X-REAL-IP
  4. HTTP_CLIENT_IP
2017年12月13日 10:09
編輯回答
挽青絲

實(shí)際上,你沒有辦法真的能保證你獲取到的一定是當(dāng)前用戶的公網(wǎng)ip。
我們常用的幾個(gè)頭
REMOTE_ADDR 這個(gè)頭是安全的,但是他是當(dāng)前節(jié)點(diǎn)的上一跳連接的IP,在現(xiàn)在的復(fù)雜網(wǎng)絡(luò)下,這個(gè)頭很難直接用。
X-FORWARDED-FOR 這個(gè)頭是不安全的,因?yàn)橛脩艨梢詡卧?,這個(gè)頭得邏輯是 如果當(dāng)前服務(wù)器是代理,就把當(dāng)前服務(wù)器拿到的remote_addr ip加到 x-forwarded-for 這個(gè)頭的尾部,但是沒有辦法保證,這個(gè)頭里面的已有的ip到底是用戶自己發(fā)過來的還是代理服務(wù)器發(fā)過來的。
client-ip 這個(gè)是一些web服務(wù)器提供的功能,邏輯實(shí)現(xiàn)可能不一致,大概就是如果有x-forwarded-for,就取最早的一個(gè)合法ip,如果沒有,就取remote_addr。

所以,你只能取你信任的IP前的一個(gè)ip。比如,你使用了CDN,那么你只能信任CDN節(jié)點(diǎn)IP的前一個(gè)IP(CDN節(jié)點(diǎn)ip有白名單,當(dāng)然,你也可以讓CDN把客戶ip用特殊的頭發(fā)給你),如果沒有使用CDN,那么,你能信任的只有Remote_addr 或者,你的入口反向代理服務(wù)器獲取的remote_addr

2017年12月22日 03:19