1、手机连上wifi后会自动弹窗的原理html
生活中,有不少须要认证的路由器,手机链接wifi热点后会自动弹出一个网页,让用户输入帐号和密码,好比星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室。其实这是一种叫强制门户认证的技术--Captive Network。就是说,单用户连上一个wifi后,能够不须要输入wifi的密码,可是须要进行认证才可以访问到互联网。这种路由器有不少开源的软件,好比wifidog、openwrt等。可是他们的原理都是同样的,经过iptable跳转,DNS拦截,和HTTP重定向,甚至有的会采用网页重构,最后不管用户输入任何域名,任何URL,任何IP地址,都会被强制指定到某一个网页上去。
补充解释(DNS拦截简单的说,就是对IP地址的绑架,让DNS解析成WEB开发者想要让用户访问的IP地址,这样就实现了对IP的绑架。而HTTP重定向是把当前请求的网页转移到另外一个不一样的网页,虽然用户不知道本身访问的网页已经发生了重定向,可是HTTP头会记录下这一切,重定向后的网页返回的HTTP状态是30X。网页重构是经过JS进行网页的重定向,可是不会改变HTTP头的状态。)
因此,手机只要在连上wifi后,就去向互联网发起一次请求(不一样的手机有不一样的请求地址,好比苹果手机请求的是www.apple.com,而原版的安卓手机请求的是client3.google.com,可是这些请求的网址,不一样的手机厂商本身能够经过修改Android的内核进行修改的,不是绝对的,有的手机甚至直接阉割了这个原版安卓的功能,有的则对这个功能进行了限制使用)。若是返回的网页是被重定向过的,也就是HTTP头的状态是30X的,手机就会认为这个wifi须要强制认证,所以会弹出浏览器,从新发起一次请求。这就是手机连上wifi后会自动弹窗的原理。web
2、实现方案apache
若是要作一个可让手机连上wifi后会自动弹窗网页的wifiAP热点,那么就要按照上面原理说的,要让手机第一次发起的请求返回的HTTP头状态变为30X。
这里由于RTK没可以链接到外网,因此须要本身移植一个DNS服务器到RTK上,进行域名的解析,并对IP地址进行绑架,这个原理跟iptable是同样的。我这里移植了一个最新的开源DNS服务器,bind.9.10.tar.gz 域名解析服务器。移植过程都是同样的,官网下载源码,而后解压缩,进行交叉编译,最后安装,而后拷贝到RTK开发板上。须要说的是DNS的配置问题,怎么把全部的域名都解析为一个固定的IP呢,其实很简单,DNS的配置规则书写也是比较简单的。只须要在配置文件的named.conf中加入这样一条规则:
“@ IN SOA ns.domain.com.
hostmaster.domain.com.
( 1 3h 1h 1w 1d )
IN NS 172.16.31.1
* IN A 172.16.31.1”
表示让全部的域名都指向172.16.31.1这个IP地址,* 号表示全部域名。就是这么简单。
PS:其实若是RTK可以连上外网,外网有好多专业的DNS域名解析服务器,等解析回来的IP地址后,利用iptable对IP地址进行跳转,也是同样可以绑架IP的,可是这里RTK不可以上网,因此以前移植的iptable的做用不大。可是加上iptable的跳转也是能够的,若是遇到不安分的用户,随意输入IP地址,这时候iptable就能够进行IP跳转了。浏览器
接着,DNS把域名都强制解析为RTK的本机地址,172.16.31.1。这个时候,RTK上的web服务器就要发挥威力。web服务器都有一个模块功能,叫rewrite,就是重写网页的意思,专业名字叫HTTP的重定向,就是这个模块起的做用。因此,在web服务器的配置脚本中,把rewrite模块的注释去掉,由于web服务器,不管是apache,lighttpd都是默认不开启这个功能的,由于这个功能是在服务器进行维修的状况下,让请求都转移到备份服务器去才用得上,因此普通的web是没有开启的。可是咱们偏偏要利用他的这个功能,就是要他发生重定向。因此这个功能必须启动。而后在配置文件的最后添加这样一段语句:
“#$HTTP["host"] ="^(!=a.html)" {
# url.redirect = (
# "^/(.*)" => "/index.html"
# )
#}”
告诉服务器,若是请求不是访问的a.html这个网页,就让他跳到index.html这个网页上,而index.html就是RTK的网页。这样,就实现了网页的跳转了。服务器
3、存在的问题
经过上面的原理的介绍,不难发现,若是手机连上wifi后不主动请求,那么web服务器就不会提供服务,那手机就不会弹出网页。或者有些手机的软件作一些限制,好比在手机上经过还有一个智能识别软件,若是这个热点不可以访问外面,那就不弹出,甚至有的手机还直接作成,不能链接外网的热点,就不显示出来,直接屏蔽掉了。因此,最终能不能弹出网页,很大程度上得看手机厂商的脸色。若是他们把这个功能阉割了,那就永远都没法弹窗,由于手机都没有去请求服务器。因此这种状况就得用户在连上wifi后,自动手动在点击一下手机上的浏览器,发起请求,而后被RTK上的DNS拦截,进而发生HTTP重定向。app