Как лучше всего получить IP-адрес в PHP:
getenv('REMOTE_ADDR');
or,
$_SERVER['REMOTE_ADDR'];
пожалуйста, скажите мне разницу, если есть, между ними.
Как лучше всего получить IP-адрес в PHP:
getenv('REMOTE_ADDR');
or,
$_SERVER['REMOTE_ADDR'];
пожалуйста, скажите мне разницу, если есть, между ними.
getenv() можно использовать для доступа к любым переменным среды (PHP просто регистрирует REMOTE_ADDR как переменную среды для скрипта), в то время как с помощью $_SERVER вы, очевидно, получаете доступ только к содержимому суперглобальной переменной $_SERVER.
Обычный подход состоит в том, чтобы использовать для этого $_SERVER, хотя на самом деле это не имеет большого значения с точки зрения функциональности.
$_SERVER — это встроенная переменная PHP, а getenv() запрашивает значения у среды (вероятно, у Apache/IIS).
Лучший способ получить IP-адрес;
$ip = (!empty($_SERVER['REMOTE_ADDR'])) ? $_SERVER['REMOTE_ADDR'] : getenv('REMOTE_ADDR');
Но я сомневаюсь, что между этими двумя переменными есть какая-то разница... Хм.
Вероятно, было бы лучше использовать $_SERVER['REMOTE_ADDR']; для предотвращения несовместимости между серверами.
Там нет различий между вызовами tho. Как видите, в руководстве по PHP используются оба метода в одном примере. В некоторых случаях у вас не включены глобальные переменные, такие как $_SERVER, и вы вынуждены использовать getenv(). По моему опыту я никогда не видел сервер с отключенными глобальными переменными.
С помощью $_SERVER['REMOTE_ADDR']
вы напрямую читаете глобальную переменную, обращаясь к массиву $_SERVER[], который настраивается при удаленном запросе:
$_SERVER — это массив, содержащий такую информацию, как заголовки, пути и расположение скриптов. Записи в этом массиве создаются веб-сервером. Нет никакой гарантии, что каждый веб-сервер предоставит что-либо из этого; серверы могут опускать некоторые или предоставлять другие, не перечисленные здесь. Тем не менее, большое количество этих переменных учитывается в спецификации » CGI 1.1, так что вы можете ожидать их.
Функция getenv() обращается к любой переменной среды, чтобы получить соответствующее значение!
В обоих случаях вы получаете доступ к одному и тому же значению и одной и той же переменной... но $_SERVER является встроенной суперглобальной переменной PHP, вместо этого getenv() получает значение переменной, определенной в текущей среде!
Я думаю, что в этом случае использование суперглобальной переменной — лучший способ получить IP-адрес!
Этот пост немного устарел, поэтому я решил поделиться тем, как я в настоящее время получаю IP-адрес запроса в своих скриптах PHP, поскольку этот пост изначально был о лучшем способе чтобы получить запрос IP. Это лучший способ, хотя и не один из вариантов, указанных в исходном посте.
Этот подход использует небольшую библиотеку функций для простоты переносимости.
// Function to sanitize IP string
function sanitize_ip($string){
$string = trim($string);
$string = strip_tags($string);
$string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
$string = str_replace('\n', '', $string);
$string = trim($string);
return $string;
}
// Function to evaluate HTTP headers for IP
function evaluate_ip(){
$ip_keys =
array(
'HTTP_CF_CONNECTING_IP', 'HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_X_REAL_IP',
'HTTP_X_COMING_FROM', 'HTTP_PROXY_CONNECTION', 'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED', 'HTTP_COMING_FROM', 'HTTP_VIA',
'REMOTE_ADDR'
);
foreach ($ip_keys as $key){
if (array_key_exists($key, $_SERVER) === true){
foreach (explode(',', $_SERVER[$key]) as $ip){
$ip = trim($ip);
$ip = normalize_ip($ip);
if (validate_ip($ip)) return $ip;
}
}
}
// Build error response HTML
$msg =
'<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
ERROR: <span style="color:#ffc107">Invalid IP Address</span>
</div>';
echo $msg;
exit;
}
// Function to normalize IPv4 and IPv6 addresses with port
function normalize_ip($ip){
// IPv4 with port (e.g., 123.123.123.123:80)
if (strpos($ip, ':') !== false && substr_count($ip, '.') == 3 && strpos($ip, '[') === false){
$ip = explode(':', $ip);
$ip = $ip[0];
}
// IPv6 with port (e.g., [::1]:80)
else {
$ip = explode(']', $ip);
$ip = ltrim($ip[0], '[');
}
return $ip;
}
// Function to validate IP address
function validate_ip($ip){
$options = FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE;
$filtered = filter_var($ip, FILTER_VALIDATE_IP, $options);
if (!$filtered || empty($filtered)){
if (preg_match("/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/", $ip)){
return $ip; // IPv4
}
elseif (preg_match("/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/", $ip)){
return $ip; // IPv6
}
// Build error response HTML
$msg =
'<div style="width:100%; font-family:serif; font-size:24px; line-height:28px; color:#cc0000; font-weight:bold; text-align:center; padding:10px;">
ERROR: <span style="color:#ffc107">Invalid IP Address</span>
</div>';
echo $msg;
exit;
}
return $filtered;
}
function get_ip(){
$ip = evaluate_ip();
if (preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $ip, $ip_match)){
$ip = $ip_match[1];
}
return sanitize_ip($ip);
}
// To Use
$ip = get_ip();
//
Надеюсь, это поможет кому-то сейчас в 2018 году!