网站开发用到的ip知识

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值