com.android.captive,nginx – 为什么Android的Captive Portal检测不会...

博主在Raspberry Pi上使用Nginx托管了一个网站,并通过DHCP服务器将所有DNS查询解析到RPi的LAN IP。目标是创建一个强制网络门户,但遇到问题:Android设备在连接到无线网络后,不会因重定向到http://connectivitycheck.gstatic.com/generate_204而弹出浏览器。虽然iptables端口重定向能够触发门户,但通过Nginx的302重定向或200响应却无法达到相同效果。问题可能与Android的网络检测机制有关,尤其是它如何处理HTTP204响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个使用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,所以链接的代码可能与我想的不同.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值