Zur Navigation

Reverse Proxy mit mod_rewrite

RewriteCond %{HTTP:X-Forwarded-For} in verbindung mit DHCP

1 GreGSeeN

Hallo Zusammen,

mein Apache Server agiert als Revers proxy und hat derzeit 2 permanente Weiterleitungen:

httpd.conf:
ProxyRequests Off

<Proxy *>
   Order deny,allow
   Allow from all
</Proxy>

SSLProxyEngine on
RewriteEngine On
RewriteRule ^/int(.*)$ https://server1.home/int$1 [P]
RewriteRule ^/maintenance(.*)$ https://server1.home/maintenance$1 [P]

ProxyPreserveHost On
ProxyBadHeader Ignore

Folgendes Problem habe ich momentan. Alle Request auf /int werden also auf einen anderen Server geleitet. Währent einer Wartung setze ich auf dem anderen Server die Funktion .htaccess in das Verzeichnis /int.

.htaccess:
RewriteCond %{REMOTE_ADDR} !^10\.145\.2\.230$
RewriteCond %{REQUEST_URI} !^/maintenance/.*$

RewriteRule   ^.*$ /maintenance/ [L,R]

Jetzt ist es so, dass der Reverse Proxy allerdings nicht die IP adresse mitliefert und jeder User wird auf /maintenance weitergeleitet, da der Request auf den anderen Server über die IP des Reverse proxy geht.

Welchen RewriteCond muss ich in die httpd.conf schreiben damit die IP adresse des Clients auf den 2. Server geht? Mir fällt nur folgendes ein:

RewriteCond %{HTTP:X-Forwarded-For} !^10\.145\.2\.230$
RewriteRule ^/maintenance(.*)$ https://server1.home/maintenance$1 [P]

Problem hier ist nur, dass ich keine feste IP habe sondern diese über den DHCP vergeben wird. In der .htaccess kann ich die IP manuell anpassen auf die httpd.conf habe ich allerdings keinen zugriff und möchte nicht jedes mal vor und nach einem Release Wechsel ein Change Request beauftragen!!

Kann mir jemand helfen??

Vielen Dank schon mal :)

25.06.2010 13:08

2 Jörg

Eien Möglichkeit wäre es vielleicht, dir einen Cookie zu setzen und diesen auszuwerten:

RewriteCond %{HTTP_COOKIE} !schwerZuErratenderCookieName
RewriteRule ^/maintenance(.*)$ https://server1.home/maintenance$1 [P]

Edit: ich habe es noch nicht probiert - aber der Cookie sollte ja vom Proxy übermittelt werden?

25.06.2010 15:07 | geändert: 25.06.2010 15:09

3 GreGSeeN

Hallo Jörg,

danke für deine Antwort!
Wie funktioniert das genau mit den Cookies? Gibt es hier mehrere? Die SessionID wird bereits über die Cookies übertragen? Wird das durch das Setzen eines "Schwer zu erratenden Cookies" überschrieben?

25.06.2010 15:50

4 Jörg

Du musst nur einen anderen Namen wählen als den des Session-Cookies (in PHP z.B. standardmäßig "PHPSESSID"), dann wird letzterer nicht überschrieben.

Einen Cookie kannst du serverseitig setzen, z.B. in PHP mit setcookie(). Hier musst du nur den Cookienamen entsprechend definieren, den Cookiewert kannst du beliebig wählen - die RewriteCond wertet ja nur den Cookienamen aus

Eine andere Möglichkeit ist es, den Cookie direkt im Browser zu setzen, z.B. mit der Webdevelopper Toolbar in Firefox (Cookies -> Cookie hinzufügen)

25.06.2010 16:23 | geändert: 25.06.2010 16:24

5 GreGSeeN (Gast)

Hi Jörg,

danke für deine Hilfe, aber ich glaube, dass das auf Dauer keine effiziente Möglichkeit ist.

02.07.2010 12:59

6 GreGSeeN (Gast)

Hallo Jörg,

ich habe jetzt eine Lösung!! Ich wundere mich warum ich nicht gleich drauf gekommen bin :)

Über die PHP-Info habe ich mir alles anzeigen lassen, was der Reverse Proxy an den Applikationserver liefert.

Dann habe ich das Programm .htacces wieder auf den Applikationserver gelegt und kann nun mit

RewriteCond %{HTTP:X-Forwarded-For} !^10\.145\.10\.13$
RewriteCond %{REQUEST_URI} !^/maintenance/.*$

RewriteRule   ^.*$ /maintenance/ [L,R]

steuern wer in welches Verzeichnis darf!! Zuvor habe ich über

RewriteCond %{REMOTE_ADDR} !^62\.225\.127\.166$

nur die IP geprüft, die ja standardmäßig die des Reverse Proxys war :)

Nun lese ich die HTTP-Heada aus und es funktioniert :)

Danke nochmal für deine Hilfe!!

Grüße

05.07.2010 13:17

Beitrag schreiben (als Gast)





[BBCode-Hilfe]