我正在手动实施 WiFi 强制门户。一切工作正常,但有一个小问题:我希望每个人都能看到他们的移动操作系统(或计算机操作系统)强制门户弹出窗口,以获得完美的体验。
由于他们每个人都有自己扭曲的做法,我似乎无法获得一致的跨平台体验。
为了实现这一点,您能否帮助我描述一下(1)WiFi 客户端的哪些 URL 请求需要重定向到登录页面,以及/或(2)可以使用哪些 nginx 或 apache Web 服务器配置将 WiFi 客户端重定向到登录页面?
本例中的强制门户登录页面是http://captiveportal.lan。以下是我正在尝试解决此问题的一些操作系统。
Android 4/5/6
- 阿帕奇:
RedirectMatch 302 /generate_204 http://captiveportal.lan
- nginx: ?
以前的 Android 版本
- 阿帕奇:?
- nginx: ?
iOS 8
Apache .htaccess:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^CaptiveNetworkSupport(.*)$ [NC]
RewriteRule ^(.*)$ http://captiveportal.lan [L,R=302]
nginx: ?
以前的 iOS 版本
- 阿帕奇:?
- nginx: ?
Windows 手机
- 阿帕奇:
RedirectMatch 302 /ncsi.txt http://captiveportal.lan
- nginx: ?
Windows 7\8\10
- Apache:参见 Windows Phone(适用于 Win7)。
- nginx: ?
苹果系统
- 阿帕奇:?
- nginx: ?
Amazon Kindle - 它有弹出窗口吗?
- 阿帕奇:?
- nginx: ?
答案1
所有移动操作系统只需检查网页即可确定其是否位于强制门户之后。
机制如下:
- 获取/发布http://foo.com/bar.html
- 如果 bar.html == [预期内容] > 打开 Internet
- 如果 bar.html != [预期内容] > 强制门户
- 如果 bar.html[status] != SUCCESS > 无网络
此外,对于 iOS,您需要为您的 WiFi 网络设置一个域,因为它假定没有访问权限的无域网络是家庭网络,并将其标记为无网络而不是强制门户。
只需确保使用 HTTP 成功明确将以下 URL 重定向到您的强制门户:
Android/Chromebook:
- clients3.google.com
iOS 6:
- gsp1.apple.com
- *.akamaitechnologies.com
IOS 7:
- www.appleiphonecell.com
- www.airport.us
- *.apple.com.edgekey.net
- *.akamaiedge.net
- *.akamaitechnologies.com
iOS 8/9:
视窗
- ipv6.msftncsi.com
- www.msftncsi.com
许多供应商也开始使用用户代理“CaptiveNetworkSupport”,尽管它不像上面的 URL 方法那么常见。只需检查该 UA 并始终为其提供您的门户页面...但并非 100% 有效。
我使用 URL 方法并且效果很好。
答案2
亚马逊 Kindle(Fire)
Amazon Kindle(Fire)发出以下请求,如果无法检索“...它会假定用户必须登录并显示登录屏幕。”:
iOS 8.4
对于最新的 iOS,我必须匹配所有 URI 才能请求http://captive.apple.com- 不仅仅是“/hotspot-detect.html”。
iOS 8.4 客户端使用随机生成的 URI(例如“/xmqPyZUv/3r8jTjv8.html”和“/7exN0TV7q0COX0/eKlBU8baU2tape/fjXUzDHBdE6W0O/BGbw7iYU2DVBh1/sVBlx8icYzTTtE.html”)在以下域的 URL 请求中发出请求,以检测强制门户: