Apache-Httpd
使用 Apache 實現強制門戶
我一直在嘗試在 Apache 中建構一個強制門戶,我計劃讓其了解 Apple CNA。
我在 StackOverflow 中找到了幾篇相關的文章,包括Captive portal popups…和How to create WiFi popup login page。
我將相關的 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]
但有類似的循環問題。該怎麼辦?
經過調查並進行了一些測試,很明顯 Apple CNA 本身就是一個網路瀏覽器。顯然,如果沒有正確地進行異常處理,所有後續請求將再次具有相同的使用者代理。因此它將從頭開始程序/門戶重定向,因此重定向循環。
因此,在 Apple 的規則中,如果目標主機是強制門戶伺服器,我們將不再重定向。
# 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 目錄下。
另請參閱強制門戶檢測、彈出實現?