大家一般都是用 $_SERVER['REMOTE_ADDR'] 来获取用户 IP,
但是如果使用了反向代理的, HTTP 头中 REMOTE_ADDR 就不是用户的地址, 反而是上一级代理的地址了
经过我的研究有两种方法来获取用户的真实外网 IP
方法一: curl
代码如下:
- function get_onlineip() {
- $ch = curl_init('http://www.ip138.com/ip2city.asp');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- $a = curl_exec($ch);
- preg_match('/\[(.*)\]/', $a, $ip);
- return $ip[1];
- }
方法二:$_SERVER['HTTP_X_FORWARDED_FOR'] 来获取相应的地址
代码如下:
- function get_onlineip() {
- $onlineip = '';
- if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
- $onlineip = getenv('HTTP_CLIENT_IP');
- } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
- $onlineip = getenv('HTTP_X_FORWARDED_FOR');
- } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
- $onlineip = getenv('REMOTE_ADDR');
- } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
- $onlineip = $_SERVER['REMOTE_ADDR'];
- }
- return $onlineip;
- }
来源: https://www.php1.cn/detail/php-5bd69d31cc.html