Apache 使用RewriteCond重定向IP范围

Apache 使用RewriteCond重定向IP范围,apache,.htaccess,mod-rewrite,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 如果我只是将远程主机

目前,我正在使用以下方式重定向除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
如果我只是将远程主机行更新为:

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

您可能希望与
%{REMOTE\u ADDR}
匹配,但不能使用CIDR表示法,因为
%{REMOTE\u 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]$
RewriteCond expr "-R '192.168.1.0/24'"
RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond expr "! -R '12.345.678.90/28'"
RewriteRule $ /maintenance [R=302,L]

如果您使用的是ApacheHttpD2.4或更高版本,则可以使用将REMOTE_ADDR与CIDR掩码相匹配

缩写形式如下所示:

RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.8[0-9]$
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.9[0-5]$
RewriteCond expr "-R '192.168.1.0/24'"
RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond expr "! -R '12.345.678.90/28'"
RewriteRule $ /maintenance [R=302,L]
以下较长的表格也可用,但文档表明其效率较低:

RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'"
这使得您的示例的完整解决方案如下所示:

RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.8[0-9]$
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.9[0-5]$
RewriteCond expr "-R '192.168.1.0/24'"
RewriteEngine On
RewriteCond %{REQUEST_URI} !/maintenance$
RewriteCond expr "! -R '12.345.678.90/28'"
RewriteRule $ /maintenance [R=302,L]

我喜欢使用以下允许部分地址匹配的方法。在
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]
setenif主机“siteYouAreworkingON.com”访问控制
SetEnvIf Remote_Addr“用|分隔的完整或部分IP地址列表”
RewriteCond%{ENV:ACCESS_CONTROL}1
重写规则。*http://gohere.instead [左,右]

希望能有所帮助。

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


您可能希望为重定向到的合法页面执行此操作。实际的404应该用404来响应,这样我们就不会在一路上得到大量无用的搜索引擎结果。

在.htaccess中试试这个。它起作用了

RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.[0-255]

问题:你能举个例子吗?不清楚它是如何引用
%{REMOTE\u ADDR}
,而
%{REMOTE\u ADDR}
是以较长的形式明确指出的。@plusjeff我不确定您的意思-上面包含了简短形式的示例。从链接的文档中,-R与“{REMOTE\u ADDR}-ipmatch…”相同,但效率更高。
-R
是代表
%{REMOTE\u ADDR}
的缩写形式吗?如果是这样的话,如何使用high performance short form检查不同的变量(即,假设我想检查名为
%{CLIENT_IP}的变量)
使用缩写形式?如果我使用不同的变量,我总是必须使用较长的形式吗?是的,对于其他变量,您必须使用较长的形式。
-R
专门用于
远程添加。
如果您想匹配更宽的范围,例如不确定的第三个和第四个八位字节,您可以执行
!^123\.45.[0-9]{1,3}\.[0-9]{1,3}$
--这将匹配第三个和第四个八位字节中0-255之间的任何数字,但允许您定义IP的前半部分。最近,我不得不在开发的WordPress上执行此操作,以允许WordPress JetPack服务器连接到XML-RPC端点,同时仍将普通访问者重定向到单独的站点。效率非常低。
RewriteCond
,这在Apache2.2广泛使用时得到了回答,现在一切都是2.4,所以使用expr更好