如何编写htaccess rewriterule以排除IP范围?

时间:2012-02-08 18:45:49

标签: .htaccess mod-rewrite

所以我刚刚实现了AWS' CloudFront,我需要从一些htaccess规则中豁免他们的IP范围。以下是其范围的链接: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]

如何编写另一个重写[或倍数]以忽略204.246.160.0/19范围?

2 个答案:

答案 0 :(得分:2)

您可以阻止(或允许)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]

答案 1 :(得分:2)

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

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

Adddendum

当你的意思是[09]和“。”时,你的正则表达式中有一些非重大错误,如[0,9]。代替 ”。”。但你可以假设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 - 例如来自请求标题?