我有一个使用nginx托管一个简单网站的Raspberry Pi.该
RPi充当无线接入点 – 用户可以连接到其无线接入点
网络,RPi给他们一个IP(它运行DHCP服务器),他们可以
访问该网站.
因为RPi实际上并没有为用户提供互联网(只有这一个网站),所以我让用户更容易找到该网站.我没有知道网站的确切网址,而是告诉我的dns服务器(dnsmasq)DHCP服务器告诉客户端使用哪个,以解析所有查询到我的RPi的LAN IP(192.168.30.1).
此时,我的nginx在其配置中有一个条目,表示:
>如果用户请求的主机字段不是MyRPiServer.com,则将302重定向发送到MyRPiServer.com
>如果主机是MyRPiServer.com,请提供本地网站
这很棒.
我想更进一步.当Android连接到无线网络时,
它试图专门连接到http://connectivitycheck.gstatic.com/generate_204(或其他类似的谷歌页面之一)以检查请求是否被重定向.如果它获得204代码,则假定一切正常.如果没有,则假定它位于强制网络门户后面,并弹出一个浏览器窗口,打开强制网络门户登录.
出于某种原因,当我告诉nginx使用302重定向或甚至200(带有一些文本)响应generate_204页面的请求时,Android不会弹出浏览器.
我有一个mikrotik路由器,内置热点功能,确实有Android弹出浏览器与强制门户登录(在同一测试手机上).当我查看它发送给我的客户端的流量时,它是一个简单的HTTP 200,带有一些文本,就像我的一样.
似乎有效的一件事是,如果我禁用我的DNS服务器将所有内容解析为192.168.30.1,并使用iptables将端口80重定向到我的RPi上的localhost.
有人知道为什么重定向端口80在Android的强制网络门户检测方面有效,但是配置DNS服务器以解决所有到RPi本地IP的问题吗?
看看这里找到的代码https://stackoverflow.com/a/14030276/4258196,似乎Android唯一关心的是它是否可以连接到
主机,如果它返回HTTP 204.在我的情况下,它肯定是连接,
它肯定没有得到204回来(nginx日志显示它发送HTTP
302和HTTP 200).
我的手机正在运行Android 8,所以链接的代码可能与我想的不同.