36

目前,我正在使用以下命令重定向除 IP 12.345.678.90 之外的所有用户:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90
RewriteRule $ /maintenance [R=302,L]

我将使用什么语法来允许范围?在我的允许列表中,我有:

Allow from 123.45.678.90/28

如果我只是将 REMOTE_HOST 行更新为:

RewriteCond %{REMOTE_HOST} !^12\.345\.678\.90/28
4

5 回答 5

34

如果您使用的是 Apache HTTPD 2.4 或更高版本,则可以使用表达式将 REMOTE_ADDR 与 CIDR 掩码匹配。

简短的形式如下所示:

RewriteCond expr "-R '192.168.1.0/24'"

以下更长的形式也可用,但文档表明它的效率较低:

RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"

这使得您的示例的完整解决方案如下所示:

RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond expr "! -R '12.345.678.90/28'"
RewriteRule $ /maintenance [R=302,L]
于 2016-03-15T23:32:03.627 回答
31

您可能希望%{REMOTE_ADDR}匹配,但不能使用 CIDR 表示法,因为%{REMOTE_ADDR}实际上是远程地址,您可以使用正则表达式尝试匹配它。所以对于 123.45.67.89/28, (123.45.67.80 - 123.45.67.95),你必须这样做:

RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.8[0-9]$
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.9[0-5]$
于 2012-07-25T16:53:52.087 回答
1

尽管这是一个老问题,但我发现它仍然非常相关。允许 CIDR 表示法的替代方法如下(示例在虚拟主机 apache conf 文件中):

<VirtualHost *:80>
    .
    .
    .
    <Files maintenance>
        Require all denied
        Require ip 12.345.678.90/28
    </Files>
    .
    .
    .
</VirtualHost>

作为旁注,我怀疑,在没有进行任何测试或找到任何证据的情况下,这种方法比RewriteCond expr "-R '192.168.1.0/24'"提到的方法“更快”。

原因很简单,在这个高层次上似乎涉及的计算步骤较少。

注意来自被拒绝 IP 的请求者将看到“Permission denied”或“Forbidden”类型的响应。您可以通过添加以 200/OK 响应的自定义 404 页面来使其更漂亮(这样 Google 不会惩罚您的域)。200/OK 必须是自定义 404 页面的第一行。例如,在 PHP 中,第一行将显示为:

<?php header("Status: 200 OK"); ?>

您希望对重定向到的合法页面执行此操作。实际的 404 应该以 404 响应,以防止我们在路上遇到大量无用的搜索引擎结果。

于 2018-04-23T16:05:52.940 回答
1

在 .htaccess 中试试这个。它正在工作。

RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.[0-255]
于 2019-09-18T05:17:45.967 回答
0

我喜欢使用以下允许部分地址匹配的内容。在您的virtualHost/htaccess文件中

SetEnvIf HOST "siteYouAreworkingON.com" ACCESS_CONTROL<br>
SetEnvIf Remote_Addr "list of full or partia ipadresses separated by |"<br>
RewriteCond %{ENV:ACCESS_CONTROL} 1<br>
RewriteRule .* http://gohere.instead [L,R]

希望能帮助到你。

于 2016-12-06T17:13:17.147 回答