2014-06-28 6 views
5

Kann mir bitte jemand sagen, wie die folgenden IP-Bereiche (gehört zu Cloudfront) in einem mod_rewrite? Ich suche die nicht-www-Anfragen für example.com zu www.example.com, aber nicht umleiten jede IP-Adresse von IP kommenden Bereiche unterhalb zu umleiten:Apache überschreiben Subnet IP-Bereich

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 

ich ein Werkzeug verwendet genannt rgxg zu konvertieren alle oben von CIDR und Regex erstellt folgende Einträge in meinem 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] 

ich alle IP-Bereiche in meinem RewriteCond Einträge hinzugefügt haben, aber enthalten nur die erste, da ich nicht wollte Durcheinander diesen Beitrag. Die Regel scheint nicht zu funktionieren. Wenn ich nur eine einzige IP-Adresse einstelle, funktioniert das ohne Probleme.

Kann jemand bitte überprüfen und sehen, was ich falsch mache?

Danke! -Ma

Antwort

7

die im ersten Bereich Werfen wir einen Blick:

54.192.0.0/16 

In der Regex

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

Beachten Sie den Doppel ||. Angesichts der Schwierigkeit, zu debuggen, wenn es nur einen Fehler gibt, fühle ich mich nicht schlecht, wenn ich die ganze Sache wegwerfe.

Das folgende ist nicht ganz exact, weil es Fragmente bis 999 übereinstimmen würde, aber alles, was zählt, ist, dass es alle IPs im Bereich und keine anderen gültigen IPs abfängt. Es tut.

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

Und es ist einfach zu lesen. Ich würde das stattdessen empfehlen. Probieren Sie es aus, und wenn das funktioniert, können die anderen auch noch einmal besucht werden.

Ich bin nicht sicher, wie Sie die IP erhalten, aber diese je nach dem Kontext ist eine weitere Option:

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

auf einige mögliche Bereiche aussehen lassen:

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

Vielen Dank für Ihren Kommentar. Ich bin ein wenig verwirrt, wie man die Regex-Version eines CIDR erstellt. Wäre das Folgende für CIDR 54.239.128.0/18 korrekt: RewriteCond% {HTTP: X-FORWARDED-FOR}! = 54 \ .239 \ .128 \. [1-8] {1,3}? –

+0

Danke. Ich kann meinen Kopf nicht darum wickeln, wie diese Regex produziert werden. Dies ist hilfreich. –

+0

Gern geschehen.Diese wurden von einem Kollegen produziert, der coole Werkzeuge hat, diese aber nicht teilen möchte, obwohl er gerne darüber aufzeigt, was er tun kann. :) – zx81

5

Wenn Sie Apache verwenden HTTPD 2.4 oder höher, können Sie auch expressions verwenden, um REMOTE_ADDR direkt mit einer CIDR-Maske abzugleichen, anstatt diese in regexps zu konvertieren.

Die Kurzform wie folgt aussieht:

RewriteCond expr "-R '192.168.1.0/24'" 

Die folgende längere Form auch verfügbar ist, aber die Dokumentation schlägt vor, es ist weniger effizient:

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

Man kann den Ausdruck mit' RewriteCond expr '!% {REMOTE_ADDR} -ipmatch' 192.168.1.0/24 '"' negieren –