强制门户弹出窗口:权威指南[关闭]


13

我正在手动实现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 :?

亚马逊Kindle-它有弹出窗口吗?

  • 阿帕奇:
  • nginx :?

5
不,它不是太广泛,它只是一个多平台问题。也许可能存在最多平台的问题。它也已经达到“显着的问题”状态(超过2500次观看),因此人们对此非常感兴趣,并且您通过阻止捐款大量涌入而对所有人都造成了极大的伤害。
ppparadox '16

非常感谢您的帖子;它让我做这个unix.stackexchange.com/questions/386242/...
瑞˚F里贝罗

Answers:


6

所有移动操作系统仅检查网页即可确定它们是否位于强制门户后面。

机制是这样的:

  1. GET / POST http://foo.com/bar.html
  2. 如果bar.html == [预期内容]>打开Internet
  3. 如果bar.html!= [期望的内容]>强制门户
  4. 如果bar.html [状态]!=成功>没有网络

另外,对于iOS,您需要为WiFi网络拥有一个域,因为它假定无访问权的无域网络是家庭网络,并且将其标记为“无网络”而不是“强制门户”。

只要确保使用HTTP Success将以下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方法,并且运行良好。


想要共享一些用于获取弹出窗口的有效Web服务器conf \ firewall规则\ php代码段?
ppparadox

看起来Android v6使用的是其他网址。connectivitycheck.gstatic.com这是这里所说的
DavidT

为什么您必须显式重定向测试URL?在用户登录之前,您是否只为每个URL提供登录页面?
AShelly

3

亚马逊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 / sVBlE8ys URL到URL”之后):


1
iOS 8.4是否将UserAgent设置为“ CaptiveNetworkSupport”?想要共享一些用于获取弹出窗口的有效Web服务器conf \ firewall规则\ php代码段?另外,为什么有人不理会您的原因而拒绝您的投票?愚蠢的人...
ppparadox

确切的代理字符串是“ CaptiveNetworkSupport-277.10.5 wispr”。当我将这些请求(在此问题中列出)重定向到登录页面时,Apple iOS将弹出一个登录页面,而Android将显示一个登录标题栏。成功登录“登录”页面后,强制门户网站系统必须允许这些HTTP请求成功,以便弹出窗口和登录栏消失。我已经在仅使用Linux,dnsmasq和Apache httpd服务器创建的自定义强制门户中成功测试了此功能。
罗素E Glaue 2015年

忘记询问Kindle是否也设置了该用户代理。
ppparadox

1
对于kindle,我看到的是“ Dalvik / 2.1.0(Linux; U; Android 5.0.1; VS985 4G Build / LRX21Y)”(也许是kindle应用程序?)。这个线程mobileread.com/forums/showthread.php?t=188439说:“ Mozilla /5.0(Linux;如iPhone; U; zh-CN)AppleWebKit / 528.5 +(KHTML,如Gecko,Safari / 528.5 +)/ 4.0 “
罗素E Glaue 2015年

1
@ppparadox我不知道为什么我在发布后几秒钟就获得了否决票。如果您喜欢我的贡献,请给我点赞。谢谢。
罗素E Glaue 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.