2014-06-28 26 views
5

Czy ktoś może mi powiedzieć, jak umieścić następujące zakresy adresów IP (należy do Cloudfront) w mod_rewrite? szukam przekierować non-www żądania example.com do www.example.com, ale nie przekierować dowolny adres IP pochodzących z zakresów IP poniżej:Apache przerwać zakres IP podsieci

54.192.0.0/16 
54.230.0.0/16 
54.239.128.0/18 
54.239.192.0/19 
54.240.128.0/18 
204.246.164.0/22 
204.246.168.0/22 
204.246.174.0/23 
204.246.176.0/20 
205.251.192.0/19 
205.251.249.0/24 
205.251.250.0/23 
205.251.252.0/23 
205.251.254.0/24 
216.137.32.0/19 

Użyłem narzędzia o nazwie rgxg do konwersji wszystkie powyższe z CIDR do regex i stworzył następujące wpisy w moim httpd.conf:

RewriteCond %{HTTP_HOST} ^example\.com$ [NC,OR] 

    RewriteCond %{HTTP:X-FORWARDED-FOR} !54\.192(\.(25[0-5]|2[0-4][0-9]||1[0-9]{2}|[1-9]?[0-9])){2} 

    RewriteRule ^/(.*)?$ http://www.example.com/$1 [R=301,NC,NE,L] 

Dodałem wszystkie zakresy adresów iP w moich wpisach RewriteCond ale włączone tylko pierwszy z nich, bo nie chciała zagracać ten post. Reguła nie działa. Jeśli podam tylko jeden adres IP, działa on bez problemu.

Czy ktoś może sprawdzić i zobaczyć, co robię źle?

Dzięki! -Ma

Odpowiedz

7

Spójrzmy na pierwszym zakresie:

54.192.0.0/16 

W regex

54\.192(\.(25[0-5]|2[0-4][0-9]||1[0-9]{2}|[1-9]?[0-9])){2} 

zauważy podwójne ||. Biorąc pod uwagę, jak trudno jest debugować, jeśli jest choćby jeden błąd, nie czuję się źle, wyrzucając całą rzecz.

Następujące informacje nie są w pełni zgodne z exact, ponieważ pasują do fragmentów o rozmiarze do 999, ale ważne jest tylko to, że przechwytuje wszystkie adresy IP w tym zakresie i nie ma innych ważnych adresów IP. To robi.

54\.192\.[0-9]{1,3}\.[0-9]{1,3} 

I jest łatwy do odczytania. Zamiast tego polecam go użyć. Wypróbuj go, a jeśli to zadziała, pozostałe można również ponownie przejrzeć.

nie jestem pewien, jak można otrzymać adres IP, ale w zależności od kontekstu Jest to kolejna opcja:

RewriteCond %{REMOTE_ADDR} !^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$ 

Spójrzmy na niektórych potencjalnych zakresach:

54.192.0.0/16 => ^54\.192\.[0-9]{1,3}\.[0-9]{1,3}$ 
54.230.0.0/16 => ^54\.230\.[0-9]{1,3}\.[0-9]{1,3}$ 
54.239.128.0/18 => ^54\.239\.(?:19[01]|1[3-8][0-9]|12[89])\.[0-9]{1,3}$ 
54.239.192.0/19 => ^54\.239\.(?:22[0-3]|2[01][0-9]|19[2-9])\.[0-9]{1,3}$ 
54.240.128.0/18 => ^54\.240\.(?:19[01]|1[3-8][0-9]|12[89])\.[0-9]{1,3}$ 
204.246.164.0/22 => ^204\.246\.16[4-7]\.[0-9]{1,3}$ 
204.246.168.0/22 => ^204\.246\.(?:17[01]|16[89])\.[0-9]{1,3}$ 
204.246.174.0/23 => ^204\.246\.17[45]\.[0-9]{1,3}$ 
204.246.176.0/20 => ^204\.246\.(?:19[01]|18[0-9]|17[6-9])\.[0-9]{1,3}$ 
205.251.192.0/19 => ^205\.251\.(?:22[0-3]|2[01][0-9]|19[2-9])\.[0-9]{1,3}$ 
205.251.249.0/24 => ^205\.251\.249\.[0-9]{1,3}$ 
205.251.250.0/23 => ^205\.251\.25[01]\.[0-9]{1,3}$ 
205.251.252.0/23 => ^205\.251\.25[23]\.[0-9]{1,3}$ 
205.251.254.0/24 => ^205\.251\.254\.[0-9]{1,3}$ 
216.137.32.0/19 => ^216\.137\.(?:6[0-3]|[45][0-9]|3[2-9])\.[0-9]{1,3}$ 
+0

Dzięki za komentarz. Jestem trochę zdezorientowany, jak stworzyć wersję CIRR wyrażenia regularnego. Czy poniższe będą dokładne dla CIDR 54.239.128.0/18: RewriteCond% {HTTP: X-FORWARD-FOR}! = 54 \ .239 \ .128 \. [1-8] {1,3}? –

+0

Dziękuję. Nie mogę objąć głowy, jak powstają te regex. Jest to pomocne. –

+0

Nie ma za co.Zostały one wyprodukowane przez kolegę, który ma fajne narzędzia, ale nie lubi się nimi dzielić, chociaż lubi pochwalić się tym, co potrafią. :) – zx81

5

Jeśli używasz Apache HTTPD 2.4 lub nowszy, można również użyć expressions, aby dopasować REMOTE_ADDR do maski CIDR bezpośrednio, zamiast konwertować je do wyrażeń regularnych.

Krótka forma wygląda następująco:

RewriteCond expr "-R '192.168.1.0/24'" 

Poniższy formularz dostępny jest już także, ale dokumentacja sugeruje, że jest mniej skuteczny:

RewriteCond expr "%{REMOTE_ADDR} -ipmatch '192.168.1.0/24'" 
+0

Można zanegować wyrażenie za pomocą' RewriteCond expr "!% {REMOTE_ADDR} -ipmatch '192.168.1.0/24'" –