2014-06-28 25 views
5

Qualcuno può dirmi come inserire i seguenti intervalli IP (appartiene a Cloudfront) in un mod_rewrite? Sto cercando di reindirizzare le richieste non www per example.com a www.example.com MA non reindirizzare qualsiasi indirizzo IP proveniente da intervalli di indirizzi IP di seguito:Intervallo ip subnet ip riscrivi

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 

ho utilizzato uno strumento chiamato rgxg convertire tutto quanto sopra da CIDR a regEx e ha creato le seguenti voci nel mio 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] 

ho aggiunto tutti gli intervalli IP nelle mie voci RewriteCond ma comprendeva solo il primo come io non volevo ingombrare questo post. La regola non sembra funzionare. Se metto solo un singolo indirizzo IP, funziona senza problemi.

Qualcuno può controllare e vedere cosa sto facendo male?

Grazie! -Ma

risposta

7

Diamo un'occhiata al primo intervallo:

54.192.0.0/16 

Nella regex

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

Avviso il doppio ||. Dato quanto sia difficile eseguire il debug, se c'è anche un solo errore, non mi sento male buttare via tutto.

Quanto segue non è proprio exact perché corrisponderebbe ai frammenti fino a 999, ma tutto ciò che importa è che cattura tutti gli IP nell'intervallo e nessun altro IP valido. Lo fa.

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

Ed è facile da leggere. Consiglierei di usarlo invece. Provalo, e se funziona, anche gli altri possono essere rivisitati.

io non sono sicuro di come si riceve il IP, ma a seconda del contesto questa è un'altra opzione:

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

Diamo un'occhiata ad alcuni potenziali gamme:

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

Grazie per il tuo commento. Sono un po 'confuso su come creare la versione regex di un CIDR. Sarebbe corretto quanto segue per CIDR 54.239.128.0/18: RewriteCond% {HTTP: X-FORWARDED-FOR}! = 54 \ .239 \ .128 \. [1-8] {1,3}? –

+0

Grazie. Non riesco a mettere la testa attorno a come vengono prodotte queste regex. Questo è utile. –

+0

Prego.Questi sono stati prodotti da un collega che ha strumenti interessanti, ma non gli piace condividerli, anche se gli piace sfoggiare quello che possono fare. :) – zx81

5

Se stai usando Apache HTTPD 2.4 o successivo, è anche possibile utilizzare expressions per abbinare direttamente REMOTE_ADDR a una maschera CIDR, invece di convertirli in espressioni regolari.

La forma breve si presenta così:

RewriteCond expr "-R '192.168.1.0/24'" 

Il presente modulo è più disponibile anche, ma la documentazione suggerisce che è meno efficiente:

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

Si può annullare l'espressione con' RewriteCond expr "!% {REMOTE_ADDR} -ipmatch '192.168.1.0/24'" ' –

Problemi correlati