我找到了两种方法来提供用户的IP:
方法1:
function get_ip() {
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
$ip = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ip = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
$ip = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
$ip = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
$ip = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
$ip = getenv('REMOTE_ADDR');
else
$ip = 'UNKNOWN';
return $ip;
}
Aproach2:
function get_ip() {
if ($_SERVER['HTTP_X_FORWARDED_FOR']) {
ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
请你告诉我哪一个更好?实际上我需要在每个页面加载时执行该函数get_ip()
。如您所见,第一种方法有很多条件(if
- 语句)。那么我可以简单地使用第二个吗?
换句话说, approach1 比 approach2 有优势吗?
答案 0 :(得分:4)
使用第一个更安全,因为您进行了更多检查。大多数情况下,你可以在ip
或REMOTE_ADDR
中找到HTTP_X_FORWARDED_FOR
,如果它正在抛出代理,但有时你可以在其他变量中找到它,因为没有标准。
就我个人而言,我通常采用第二种方式,因为它更干净,但如果你想确保你使用第一种方法。
此外,您无需使用getenv()
。您可以直接在$_SERVER
也请检查此答案:What is the difference between HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR?