我一直在尝试在 Apache 中构建一个强制门户,我计划了解 Apple CNA。
我在 StackOverflow 中找到了几个相关帖子,包括强制门户弹出窗口...和如何创建 WiFi 弹出登录页面。
我将相关的Apache配置定义为:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^CaptiveNetworkSupport(.*)$ [NC]
RewriteRule ^(.*)$ http://192.168.2.1/captive/portal.html [L,R=302]
# android
RedirectMatch 302 /generate_204 http://192.168.2.1/captive/portal.html
# windows
RedirectMatch 302 /ncsi.txt http://192.168.2.1/captive/portal.html
由于 CNA 浏览器进入重定向循环,因此工作不太正常。
我还尝试将所有相关页面放入 /captive 目录中,并定义规则
RewriteRule !^captive($|/) http://192.168.2.1/captive/portal.html [L,R=302]
但有类似的循环问题。该怎么办?
答案1
经过调查和一些测试,很明显 Apple CNA 是一个自己的网络浏览器;显然,如果没有正确地做出例外,所有后续请求将再次具有相同的用户代理。因此它将从头开始程序/门户重定向,从而重定向循环。
所以在苹果的规则中,我们将不再重定向如果目标主机是强制门户服务器。
# apple
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^CaptiveNetworkSupport(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^192.168.2.1$
RewriteRule ^(.*)$ http://192.168.2.1/captive/portal.html [L,R=302]
# android
RedirectMatch 302 /generate_204 http://192.168.2.1/captive/portal.html
# windows
RedirectMatch 302 /ncsi.txt http://192.168.2.1/captive/portal.html
我们还在这里添加了一个通用的包罗万象的规则,如果前面的条件都没有发生,或者我们正在处理一个我们没有规则的操作系统,它将重定向到门户如果还没有在那里(例如不访问强制目录)。
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/captive/ [NC]
RewriteRule ^(.*)$ http://192.168.2.1/captive/portal.html [L]
显然,我要强调的是,通过此配置,所有强制门户特定文件都必须位于 /captive 目录下。
也可以看看强制门户检测、弹出窗口实施?