出现强制网络门户需要什么响应?

What response is required for captive portal to appear?

我正在尝试在小型嵌入式设备上实施强制门户。

据我所知,我需要的只是捕获智能手机对特殊 url 的请求并发送包含强制门户页面的响应。为了不维护所有可能的 URL 列表,我设置了一个 DNS,它将所有主机解析为我的设备 IP。

现在,当我将 android 设备连接到我的网络时,我会收到对 /generate_204 的请求并发送重定向响应。以下是 curl 命令的请求和响应示例:

curl -v http://google.com/generate_204 

*   Trying 192.168.1.1...
* Connected to google.com (192.168.1.1) port 80 (#0)
> GET /generate_204 HTTP/1.1
> Host: google.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 302 Found
< Content-Type: text/html
< Content-Length: 0
< Location: /
< 
* Connection #0 to host google.com left intact

使用 Postman/Chrome 我被重定向到 192.168.1.1/ 并加载了所需的页面。但是我测试了 4 android 台设备,只有一台向我显示了弹出窗口。 ios 同样的问题。我收到了对 /hotspot-detect.html 的请求,返回了与上述相同的响应,但没有任何反应。我在这里错过了什么?

谢谢!

据我了解,如果您 return 除了专属特定门户网站测试站点 return 之外的任何其他内容(即 http://google.com/generate_204 returns if that was the requested URI or what http://captive.apple.com//hotspot-detect.html return 如果那是请求的 URI) 那么你 return 将被显示,即所谓的闪屏。返回这些 URL 的内容 return 应该会抑制启动画面并欺骗设备以为它已连接到 Internet。

我找到了答案。重定向响应中的位置 header 必须看起来不同。特别是:

Location: http://192.168.1.1/

这解决了问题。