Re: [請益] Get client ip
※ 引述《fillmore (.......................)》之銘言:
: 重點就在於
: getenv("REMOTE_ADDR") = 永遠都是server的ip
: 當其他變數HTTP_X_FORWARDED_FOR......等都不work的時候
: 最後都看REMOTE_ADDR的結果
: 我認知沒錯巴???我看過很多版本的get client ip的版本了
: 最後都看REMOTE_ADDR的結果
: 但是偏偏REMOTE_ADDR的結果永遠都是server的ip
: 所以判斷一定是會有錯誤@@"
先看一下這篇文章
http://bugs.php.net/bug.php?id=44634&edit=1
以及參考資料
http://en.wikipedia.org/wiki/X-Forwarded-For
這裡有更多資料可以參考
http://google.com/#hl=en&q=REMOTE_ADDR+returns+the+same+ip+as+SERVER_ADDR
你主機的情形,
多半是透過了HTTP proxy 或是 load balancer
Client=>Router or proxy=>Server
在Server的認定Remote_addr中,當然就是那台Proxy
而Server的IP就是內部的IP,藏起來讓你無從得知
這部分你可以看一下REMOTE_PORT,在透過netstat看一下你自己本身主機的狀態
就知道中間還有多透過一層
以我們公司來說,Server的IP是192開頭的,Remote_addr是防火牆的IP
結論:其實這部分無擔心,當透過IP轉送或是PROXY的時候
HTTP_X_FORWARDED_FOR,原則上一定會有資料的。
以下funciton 你可以拿去用,我用到現在是都OK
//兩個都要複製,過濾虛擬IP
function getIP() {
if (validip($_SERVER["HTTP_CLIENT_IP"])) {
return $_SERVER["HTTP_CLIENT_IP"];
}
foreach (explode(",",$_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {
if (validip(trim($ip))) {return $ip;}
}
if (validip($_SERVER["HTTP_X_FORWARDED"])) {
return $_SERVER["HTTP_X_FORWARDED"];
}elseif(validip($_SERVER["HTTP_FORWARDED_FOR"])) {
return $_SERVER["HTTP_FORWARDED_FOR"];
} elseif (validip($_SERVER["HTTP_FORWARDED"])) {
return $_SERVER["HTTP_FORWARDED"];
} elseif (validip($_SERVER["HTTP_X_FORWARDED"])) {
return $_SERVER["HTTP_X_FORWARDED"];
} else {
return $_SERVER["REMOTE_ADDR"];
}
}
function validip($ip) {
if (!empty($ip) && ip2long($ip)!=-1) {
$reserved_ips = array (
array('10.0.0.0','10.255.255.255'),
array('127.0.0.0','127.255.255.255'),
array('169.254.0.0','169.254.255.255'),
array('172.16.0.0','172.31.255.255'),
array('192.168.0.0','192.168.255.255'),
);
foreach ($reserved_ips as $r) {
echo $r;
$min = ip2long($r[0]);
$max = ip2long($r[1]);
if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
}
return true;
} else {return false;}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
※ 編輯: arrack 來自: 219.84.185.110 (06/19 21:31)
※ 編輯: arrack 來自: 219.84.185.110 (06/19 21:35)
推
06/20 12:05, , 1F
06/20 12:05, 1F
→
06/20 12:06, , 2F
06/20 12:06, 2F
→
06/20 12:18, , 3F
06/20 12:18, 3F
→
06/20 12:21, , 4F
06/20 12:21, 4F
推
06/20 12:41, , 5F
06/20 12:41, 5F
→
06/20 12:42, , 6F
06/20 12:42, 6F
推
06/20 13:02, , 7F
06/20 13:02, 7F
→
06/20 13:02, , 8F
06/20 13:02, 8F
→
06/20 13:56, , 9F
06/20 13:56, 9F
→
06/20 13:57, , 10F
06/20 13:57, 10F
→
06/20 13:57, , 11F
06/20 13:57, 11F
→
06/20 13:59, , 12F
06/20 13:59, 12F
※ 編輯: arrack 來自: 219.84.185.110 (06/20 14:02)
推
06/20 14:02, , 13F
06/20 14:02, 13F
推
06/20 14:49, , 14F
06/20 14:49, 14F
推
06/20 16:29, , 15F
06/20 16:29, 15F
推
06/20 18:58, , 16F
06/20 18:58, 16F
推
06/20 23:53, , 17F
06/20 23:53, 17F
推
06/22 11:35, , 18F
06/22 11:35, 18F
→
06/22 11:35, , 19F
06/22 11:35, 19F
→
06/23 03:00, , 20F
06/23 03:00, 20F
→
06/23 03:01, , 21F
06/23 03:01, 21F
→
06/23 12:59, , 22F
06/23 12:59, 22F
→
06/23 12:59, , 23F
06/23 12:59, 23F
推
06/24 01:16, , 24F
06/24 01:16, 24F
→
06/24 01:16, , 25F
06/24 01:16, 25F
推
06/28 21:30, , 26F
06/28 21:30, 26F
討論串 (同標題文章)