Após investigar e fazer alguns testes, é evidente que o Apple CNA é um navegador da Web próprio; evidentemente, se uma exceção não for feita corretamente, todas as solicitações subsequentes terão novamente o mesmo agente do usuário. Então, ele irá iniciar o procedimento / redirecionamento do portal a partir do zero, assim, os loops de redirecionamento.
Portanto, na regra da Apple, não redirecionaremos mais se o host de destino for o servidor de portal cativo.
# 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
Também adicionamos aqui uma regra genérica, que se nenhuma das condições anteriores acontecer, ou se estivermos lidando com um sistema operacional para o qual não temos uma regra, ela será redirecionada para o portal se não for já existe (por exemplo, não visitar o diretório cativo).
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/captive/ [NC]
RewriteRule ^(.*)$ http://192.168.2.1/captive/portal.html [L]
Obviamente, gostaria de salientar que, com essa configuração, todos os arquivos específicos do portal cativo precisam estar abaixo do diretório / captive.
Veja também Detecção de portal cativo, implementação de popup?