使用RewriteCond重定向一系列IP

时间:2012-07-25 15:37:43

标签: apache .htaccess mod-rewrite

目前,我使用以下方法重定向除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

5 个答案:

答案 0 :(得分:22)

您可能希望%{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]$

答案 1 :(得分:19)

如果您正在使用Apache HTTPD 2.4或更高版本,则可以使用expressions将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]

答案 2 :(得分:1)

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

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

作为旁注,我怀疑,没有做任何测试或找到任何证据,这种方法更快&#34;而不是提到的RewriteCond expr "-R '192.168.1.0/24'"方法。

这是因为在这个高级别上似乎涉及的计算步骤较少。

N.B。来自被拒绝的IP的请求者将看到&#34;权限被拒绝&#34;或者&#34;禁止&#34;类型响应。您可以通过添加以200 / OK响应的自定义404页面来实现这个更漂亮(这样Google就不会对您的域名进行惩罚)。 200 / OK必须是自定义404页面的第一行。例如在PHP中,第一行是:

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

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

答案 3 :(得分: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]

希望它有所帮助。

答案 4 :(得分:0)

在.htaccess中尝试一下。它正在工作。

JsonPath.parse(json).read("$..[?(@.name='Edit'), (@.id=5756)]")