我正在尝试在小型嵌入式设备上实现强制门户。
据我了解,我所需要的只是捕获智能手机对特殊 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
使用邮递员/Chrome,我被重定向到192.168.1.1/,并加载了所需的页面。但是,我测试了 4 台安卓设备,只有一台向我展示了一个弹出窗口。与ios相同的问题。我抓住了一个请求,/hotspot-detect.html
返回了与上述相同的响应,但没有任何反应。我在这里错过了什么?
谢谢!
我的理解是,如果您返回的不是捕获特定门户测试站点返回的内容(即,如果这是请求的 URI,则返回 http://google.com/generate_204 返回的内容,或者如果这是请求的 URI,则 http://captive.apple.com//hotspot-detect.html 返回的内容(,则将显示您返回的内容,即所谓的启动屏幕。返回这些 URL 返回的内容应该会禁止显示初始屏幕,并欺骗设备认为它已连接到 Internet。
我找到了答案。重定向响应中的位置标头必须看起来不同。特别:
Location: http://192.168.1.1/
这解决了问题。