我正在尝试使用PHP脚本来比较人员的IP与文本文件(每行一个IP).如果此人的IP不在文本文件中,那么他将被重定向到decline.html.我知道我可以使用.htaccess,但IP列表可能真的很长.
这是我到目前为止的代码:
<?php
$ipArray = file('ip.txt');
unset($allowed);
foreach ($ipArray as $ipTest) if (substr_count($_SERVER['REMOTE_ADDR'],trim($ipTest)) != "0") $allowed = true;
if ($allowed != true) {
header('location: /declined.html'); // the banned display page
die();
}
?>
Run Code Online (Sandbox Code Playgroud)
我希望能够在我只想要某些IP看到的每个页面中调用此脚本,这就是我试图用它来调用它:
<? include('ip_allow.php'); ?>
Run Code Online (Sandbox Code Playgroud)
当我的IP不在ip.txt中时,当我在HTML页面中调用PHP脚本时,它不会将我重定向到/declined.html!我怎样才能解决这个问题?同样,我的问题不是如何使用.htaccess,而是如何修复我的脚本!谢谢.
对于IP过滤,最好在处理链中尽早完成.按优先顺序排列:
您很可能无法访问路由器或防火墙级别,但您可以使用Apache的mod_rewrite使用外部文件创建动态块.设置"启用的IP"文件,如下所示:
a.b.c.d ALLOWED
b.c.d.e ALLOWED
c.d.e.f ALLOWED
etc...
Run Code Online (Sandbox Code Playgroud)
它基本上是"关键值",其中密钥是IP地址
那你的mod_rewrite规则(我把它们编号为参考)
1. RerwriteMap ipfiltermap txt:/path/to/your/ips/list
2. RewriteCond %{REMOTE_ADDR} (.*)
3. RewriteCond %{ipfiltermap:%1} !ALLOWED
4. RewriteCond %{REQUEST_URI} !^/declined.html
5. RewriteRule .* /forbidden.html [L]
Run Code Online (Sandbox Code Playgroud)
它们的工作原理如下:
所有这些的相关Apache文档都在这里.