根据 IP 地址重定向访问者


Redirect visitors based on IP address

我做了一个页面,我想用IP地址块保护它。

每个访问example.com的人都应该被重定向到example.com/block.php,除非我知道IP地址。我希望能够在某处的列表中添加大量 IP 地址。在我将某人的IP地址添加到列表中后,当他们再次访问example.com时,他们现在应该被重定向到example.com/index.php

这可能吗?我见过很多看起来相同的问题,但没有一个能真正回答我的问题。

有几种方法可以做到这一点,因为您的问题中有 htaccess 标签,我假设您正在寻找 htaccess 文件解决方案。

如果您没有使用 apache 2.4(或更高版本),您可以使用 mod_authz 来处理所有阻塞。像这样:

# this makes it so blocked IPs get shown the block.php page
ErrorDocument 403 /block.php
Order Allow,Deny
Deny from all
Allow from 1.2.3.4
Allow from 1.2.3.5
Allow from 5.6.7.8
etc...

在这里,您可以阻止所有内容并保留"允许发件人"行的列表。如果要允许整个子网,可以缩短它们,例如

Allow from 1.2.3

将允许从 1.2.3 开始的 IP。

您也可以为此使用mod_rewrite:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^1'.2'.3'.4$
RewriteCond %{REMOTE_ADDR} !^1'.2'.3'.5$
RewriteCond %{REMOTE_ADDR} !^5'.6'.7'.8$
RewriteRule ^ /block.php [L,F]

在这里,您有更多的灵活性,因为您可以使用正则表达式来匹配 IP。所以你可以做这样的事情:

RewriteCond %{REMOTE_ADDR} !^1'.2'.[3-6]'.

因此,这允许所有以 1.2.3、1.2.4、1.2.5 和 1.2.6 开头的 IP。

您也可以将这些指令放入服务器/vhost 配置文件中,它会在那里而不是 htaccess 文件中更快地工作。

这个怎么样?

<?php
$allowed = array(
    '123.45.67.890',
    '456.45.67.890',
    '789.45.67.890',
);
if(!in_array($_SERVER['REMOTE_ADDR'], $allowed)) {
    header("Location: /block.php");
    exit();
}
// continue with code ...
?>

希望它有效!