如何仅允许某些IP查看网页?

use*_*120 4 php arrays ip

我正在尝试使用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,而是如何修复我的脚本!谢谢.

Mar*_*c B 5

对于IP过滤,最好在处理链中尽早完成.按优先顺序排列:

  1. 路由器
  2. 火墙
  3. 网络服务器
  4. 脚本

您很可能无法访问路由器或防火墙级别,但您可以使用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)

它们的工作原理如下:

  1. 将允许的IP定义为"键值"对,其中键是允许的IP,值是"允许",作为名为"ipfiltermap"的映射
  2. 捕获当前请求的远程地址(客户端IP)
  3. 使用在步骤2中捕获的IP,在ipfiltermap中查找,并查看IP是否没有"允许"一词
  4. 特别是从IP执行中豁免"拒绝"页面 - 如果不在此处,则禁用的IP将进入无限重定向循环
  5. 如果所有3个RewriteConds都匹配,那么用户来自禁用的IP,应该被重定向到fobidden页面.

所有这些的相关Apache文档都在这里.