Hallo Community,

ich sitze an einem kleinen Problem das mich am Wochende verzweifeln
liess. Ich habe einen kleinen cluster mit (zunächst) einem loadbalancer
und drei backend Webservern aufgesetzt.

Alle Server benutzen Apache 2.2.3 mit mod_proxy und mod_rewrite.

Die Hostnamen sind:

www.meinefirma.de (eingehende Anfragen, load balancer)

web1.meinefirma.de
web2.meinefirma.de
web3.meinefirma.de

Eingehende Anfragen an www.meinefirma.de werden auf die Backend-Server
verteilt, und anhand eines Cookies über eine Sitzung hinweg gespeichert.
Das klappt sehr gut.

Es ist allerdings so, das ich für die URL zusätzlich einen rewrite benötige, und zwar
in der Form:

^article/(.*)$ /products.php?article=$1

Wenn ich diese Regel als RewriteRule auf einem Backend-Server in die .htaccess
eintrage, und den Backend-Server direkt anspreche (web1.meinefirma.de/article/123)
dann klappt die Umleitung prima (er ruft dann intern web1.meinefirma.de/products.php?article=123).

Rufe ich allerdings über den Proxy die Adresse auf (WWW.meinefirma.de/article/123),
dann leitet der proxy die Anfrage 1:1 an den Backend-Server durch. Der Backend-Server
schreibt die URL dann anhand der Regel um. Es klappt.
Das Problem ist jedoch, das das entsprende von Apache gesetzte COOKIE verloren geht,
und fortan alle Anfragen für einen Client verteilt über alle Backend-Server geschehen,
statt den client per COOKIE auf einem einzigen Backend-Server zu binden.


Da dies wohl problematisch ist, habe ich mir gedacht ob es nicht am Einfachsten
wäre wenn ich direkt auf dem Proxy (WWW.meinefirma.de) die RewriteRule einbaue,
so das die Anfragen an (www.meinefirma.de/article/123) noch auf dem proxy umgesetzt
werden in www.meinefirma.de/products.php?article=123 und diese an einen Backend-Server
übergeben wird in der Art (webX.meinefirma.de/products.php=?article=123)


Für die Techies hier die derzeitigen Config-Einstellungen (die relevanten).

Zunächst der Load Balancer:
(/etc/apache2/sites-enables/000-default)

<VirtualHost *>
ServerName www.meinefirma.de
DocumentRoot /var/www/www.meinefirma.de/data

RewriteEngine On
# RewriteRule ^panne/(.*)$ /pannen.php?panne=$1

ProxyRequests Off

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

ProxyPass /balancer-manager !

# das geht nur mit dem kommenden apache2 2.2.5 :/
# ProxyPassMatch ^panne/(.*)$ balancer://mycluster/pannen.php?panne=$1

ProxyPass / balancer://mycluster/ stickysession=BALANCEID nofailover=On

ProxyPassReverse / http://web1.meinefirma.de/
ProxyPassReverse / http://web2.meinefirma.de/
ProxyPassReverse / http://web3.meinefirma.de/

<Proxy balancer://mycluster>
BalancerMember http://web1.meinefirma.de route=web1
BalancerMember http://web2.meinefirma.de route=web2
BalancerMember http://web3.meinefirma.de route=web3
ProxySet lbmethod=byrequests
</Proxy>

<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow
Allow from all
</Location>

ErrorLog /var/www/www.meinefirma.de/logs/error.log
LogLevel debug
CustomLog /var/www/www.meinefirma.de/logs/access.log combined
</VirtualHost>


Und nun exemplarisch ein Backend-Server (webX.meinefirma.de):

Die Config ist hier Standard (nimmt Anfragen für webX.meinefirma.de entgegen).
Zusätzlich gibt es im Root des Webs ein .htaccess file mit folgendem
Layout:

RewriteEngine On
RewriteRule ^article/(.*)$ /products.php?article=$1


Das ist es eigentlich. Ich denke das Beste wäre das .htaccess auf den Backend-Servern
zu entfernen, und das Rewriting direkt auf dem Proxy durchzuführen.

Nur ist mein Problem: Wo in der Proxy-Config führe ich das Rewrite
durch, damit er es entsprechend weiterleitet?


Bin für jeden Tipp mehr als Dankbar.

viele viele Gruesse,
Morian