nginx里面ip的配置
location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
获取真实ip
使用cloudflare以后,php的$_SERVER变量会增加
[HTTP_CF_CONNECTING_IP] => 真实IP
[HTTP_CF_IPCOUNTRY] => US
[HTTP_CF_VISITOR] => {"scheme":"http"}
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如下:X-Forwarded-For: client1, proxy1, proxy2
function get_ip() { if (isset($_SERVER)){ if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]) && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"],"unkown") != 0){ $proxy_ips = explode(',', $_SERVER["HTTP_X_FORWARDED_FOR"]); foreach($proxy_ips as $proxy_ip){ if(filter_var($proxy_ip,FILTER_VALIDATE_IP,FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)){ return $proxy_ip; } } $realip = trim($proxy_ips[0]); } else if (isset($_SERVER["HTTP_CLIENT_IP"]) && strcasecmp($_SERVER["HTTP_CLIENT_IP"],"unkown")!= 0) { $realip = $_SERVER["HTTP_CLIENT_IP"]; } else { $realip = $_SERVER["REMOTE_ADDR"]; } } else { if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),"unkown") != 0){ $proxy_ips = explode(',', getenv("HTTP_X_FORWARDED_FOR")); foreach($proxy_ips as $proxy_ip){ if(filter_var($proxy_ip,FILTER_VALIDATE_IP,FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)){ return $proxy_ip; } } $realip = trim($proxy_ips[0]); } else if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"),"unkown") != 0) { $realip = getenv("HTTP_CLIENT_IP"); } else { $realip = getenv("REMOTE_ADDR"); } } return $realip; }
thinkphp:
function get_client_ip($type = 0,$adv=false)
type 返回类型 0 返回IP地址 1 返回IPV4地址数字
adv 是否进行高级模式获取(有可能被伪装)
Yii:
Yii::$app->request->userIP
判断ip是否有效
mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )
FILTER_FLAG_IPV4 - 要求值是合法的 IPv4 IP(比如 255.255.255.255)
FILTER_FLAG_IPV6 - 要求值是合法的 IPv6 IP(比如 2001:0db8:85a3:08d3:1319:8a2e:0370:7334)
FILTER_FLAG_NO_PRIV_RANGE - 要求值是 RFC 指定的私域 IP (比如 192.168.0.1)
FILTER_FLAG_NO_RES_RANGE - 要求值不在保留的 IP 范围内。该标志接受 IPV4 和 IPV6 值。
$result = !filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
ip与整数之间的转换
使用了国际上对各国IP地址的区分中使用的ip number。a.b.c.d 的ip number是:a * 256的3次方 + b * 256的2次方 + c * 256的1次方 + d * 256的0次方
php:
int ip2long ( string $ip_address ) ip转换为整数
string long2ip ( string $proper_address ) 整数转换为ip
$ip_long = sprintf('%u',ip2long($ip));
因为192大于127(二进制为01111111),192(8位)用二进制表示,最高位必然是1。导致这个4字节整型的最高位为1,所以需要使用%u格式化来输出
mysql:
INET_ATON(expr) ip转换为整数
INET_NTOA(expr) 整数转换为ip
转换成整数以后,在mysql中可以用unsigned int类型保存,只需要四个字节
使用 (带符号) INT列, 则相应的第一个八位组大于127的IP 地址值会被截至 2147483647 (即, INET_ATON('127.255.255.255') 所返回的值)
INET_ATON() 也能理解短格式 IP 地址,SELECT INET_ATON('127.0.0.1'), INET_ATON('127.1');
ip常用命令
windows:ipconfig /all
linux:ifconfig
nslookup ip地址 根据ip查询到域名
ping 域名 根据域名查询到ip地址
根据ip查询地址
http://ip.taobao.com/ 淘宝ip地址库
http://ip.qq.com/cgi-bin/index 腾讯ip分享计划
安装好geoip库并设置定时更新以后,可以通过string geoip_country_code_by_name ( string $hostname )获取用户的国家代码
查询ip的网站
http://ip138.com/
http://ipaddress.com/
118.187.41.226
使用全球节点ping域名
https://asm.ca.com/en/ping.php
http://www.ipip.net/ping.php