![PHP/Ruby 强制门户第一个域名似乎被缓存](https://linux22.com/image/642726/PHP%2FRuby%20%E5%BC%BA%E5%88%B6%E9%97%A8%E6%88%B7%E7%AC%AC%E4%B8%80%E4%B8%AA%E5%9F%9F%E5%90%8D%E4%BC%BC%E4%B9%8E%E8%A2%AB%E7%BC%93%E5%AD%98.png)
我已经使用 iptables 创建了一个强制门户
我使用许多人似乎都在使用的方法:用户可以请求 DNS,数据包标记为 99。99 表示没有互联网,否则用户可以访问。
当用户访问页面时,例如访问 Stack Overflow。用户会收到免责声明。他/她点击确定。服务器会执行以下规则:
`sudo /sbin/iptables -t mangle -I captivePortal 1 -m mac --mac-source {$mac} -j RETURN`;
`sudo /sbin/iptables -t mangle -I captivePortal 1 -s {$_SERVER['REMOTE_ADDR']} -j RETURN`;
我已尝试过:
使用 Thin 独立版 sinatra。使用 erb 渲染模板。当用户在身份验证后重新加载时,他们会在访问初始域时获得免责声明。当他们访问另一个域时,他们不会获得免责声明页面。
使用 php 设置 apache2,用 php 重写所有内容。添加元标记以防止在浏览器中缓存,但结果相同。原始域名始终重定向到免责声明,但其他网站没问题。
我想要实现的目标
用户需点击免责声明上的“接受”后,方可使用WIFI。
重新加载 apache2 或重新启动 Sinatra 确实可以解决这个问题,但这不是一个低端 alix 主板上的正确解决方案。
答案1
发现将 mac 地址插入 iptables 后我需要使用 conntrack。
/usr/sbin/conntrack -L \
|grep $1 \
|grep ESTAB \
|grep 'dport=80' \
|awk \
"{ system(\"conntrack -D --orig-src $1 --orig-dst \" \
substr(\$6,5) \" -p tcp --orig-port-src \" substr(\$7,7) \" \
--orig-port-dst 80\"); }"
http://aryo.info/labs/captive-portal-using-php-and-iptables.html