如何编写 htaccess 重写规则来排除 IP 范围?

How can I write an htaccess rewriterule to exclude an IP range?

提问人:Andrew G. Johnson 提问时间:2/9/2012 更新时间:2/9/2012 访问量:7479

问:

因此,我刚刚实施了 AWS 的 CloudFront,我需要将其 IP 范围从一些 htaccess 规则中免除。以下是其范围的链接: https://forums.aws.amazon.com/ann.jspa?annID=910

以下是我不希望他们使用的 htaccess 规则示例:

# ROUTE CLOUDFRONT DOMAINS
rewritecond %{HTTP_HOST} ^www1.
rewriterule ^ http://www.domain.com%{REQUEST_URI} [L,R=301]

如何编写另一个 rewritecond [或多个] 以忽略 204.246.160.0/19 范围?

.htaccess mod-重写

评论


答:

2赞 anubhava 2/9/2012 #1

您可以阻止(或允许)IP 地址范围,如下所示:

# block a range of IPs
RewriteCond %{REMOTE_ADDR} =204\.246\.160\.([0-9]|1[0-9])
RewriteRule ^ - [F,L]

具体而言,对于现有规则,您可以使用:

# if domain name has www1 at start
RewriteCond %{HTTP_HOST} ^www1\. [NC]
# but request not coming from 204.246.160.0/19 IP range
RewriteCond %{REMOTE_ADDR} !=204\.246\.160\.([0-9]|1[0-9])
# redirect to http://www.domain.com/uri
RewriteRule ^ http://www.domain.com%{REQUEST_URI} [L,R=301]
2赞 TerryE 2/9/2012 #2

如果我的数学是正确的,那么 204.246.160.0/19 是 204.246.160.* 到 204.246.191.*,所以匹配它的正则表达式是,因此 cond 是204\.246\.1([678]\d|19[01]\.\d+

RewriteCond %{REMOTE_ADDR} !204\.246\.1([678]\d|19[01])\.\d+

增编

您的正则表达式中有一些不重要的错误,例如 [0,9] 当您表示 [09] 时,以及 “.” 而不是 “.”。但是您可以假设 IP 地址是有效的,因此您可以简化这些地址,这是我想出的最简单的方法:

#Filter the 204.246.160.0/19 and 216.137.32.0/19 IP subranges
RewriteCond %{REMOTE_ADDR} !^(204\.246\.1([678]\d|19[01])|216\.137\.(3[2-9]|[45]\d|6[0-3]))\.
#Filter the 205.251.xxx and 207.171.xxx /2[34] IP subranges
RewriteCond %{REMOTE_ADDR} !^(205\.251\.2(0[24567]|1[01489]|20|22|49|50|52)\|207\.172\.17[09])\.

但是,我真正担心的是,如果您引用的公告中的声明“CloudFront IP 地址经常更改,我们不能保证提前通知更改......客户不应将这些地址用于任务关键型应用程序,也不得在 DNS 名称中对它们进行硬编码。"

难道没有更好的方法来拦截这些 CloudFront IP(例如,从请求标头中拦截)吗?

评论

0赞 Andrew G. Johnson 2/10/2012
感谢您的错误修复,我已经删除了我的答案,因为您的答案采用了其中最好的部分。不确定是否有更好的方法来拦截它们,我只是假设 IP 是在 htaccess 文件中执行此操作的唯一方法
0赞 TerryE 2/10/2012
@Andrew,我又回到了避免使用IP的这一点。有没有更好的方法来检测这些入站请求,例如使用 on 或多个 HTTP_* 字段