Как я могу написать htaccess rewriterule, чтобы исключить диапазон IP? - PullRequest
2 голосов
/ 08 февраля 2012

Итак, я только что реализовал 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]

Как мне написать еще одну переписанную секунду [или несколько раз], чтобы игнорировать диапазон 204.246.160.0/19?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Если моя математика верна, то 204.246.160.0/19 равен 204.246.160. * Thru 204.246.191. * Так что регулярное выражение для соответствия это 204\.246\.1([678]\d|19[01]\.\d+ и, следовательно, cond

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

Adddendum

В ваших регулярных выражениях есть незначительные ошибки, такие как [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])\.

Однако я действительно обеспокоен тем, что в заявлении, на которое вы ссылаетесь, указано « IP-адреса CloudFront часто меняются, и мы не можем гарантировать предварительное уведомление об изменениях ... Клиенты не должны использовать эти адреса для критически важных приложений и никогда не должны использовать жесткий код». их в DNS-именах."

Нет ли лучшего способа перехвата этих IP-адресов CloudFront, например, из заголовка запроса?

2 голосов
/ 08 февраля 2012

Вы можете заблокировать (или разрешить) диапазон 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]
...