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