Apache-Httpd

使用 Apache 實現強制門戶

  • October 6, 2019

我一直在嘗試在 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 目錄下。

另請參閱強制門戶檢測、彈出實現?

引用自:https://unix.stackexchange.com/questions/386242