"RequestHeader set" abhängig von Request_URI

Alles, was den Apache betrifft, kann hier besprochen werden.

"RequestHeader set" abhängig von Request_URI

Postby FlorianH » 16. February 2011 10:14

Hallo,

ich scheitere seit zwei Tagen an dem Versuch in meinem Virtualhost den Host-Header eines Requests abhängig von einer Pattern in der Request_URI zu setzen. Bisher sehen die entsprechenden Zeilen in meiner Config so aus:

Code: Select all
SetEnvIfNoCase Request_URI (.*red.*) REDIRECTROOT=$1

RequestHeader set Host xyz.net
RequestHeader set Host docs.xyz.net env=!REDIRECTROOT

Der Original-Request Host-Header ist "docs.xyz.net" und selbst bei einem Match ändert sich dieser nicht.
Das ganze lässt sich auch umkehren, d.h.:
Code: Select all
SetEnvIfNoCase Request_URI (.*red.*) REDIRECTROOT=$1

RequestHeader set Host docs.xyz.net
RequestHeader set Host xyz.net env=REDIRECTROOT


auch das funktioniert nicht. Wenn ich mit "Header set" die Variable in den Response-header setze, sehe ich dass SetEnvIf definitiv matched und die REDIRECTROOT gesetzt wird. Muss ich davon ausgehen, dass die Requestheader direktive ausgeführt wird bevor die REDIRECTROOT überhaupt gesetzt wird? Und wenn ja, wie kann ich den Host-Header sonst anhand der URI manipulieren?

Die weiteren Zeilen in der Config sind im Übrigen folgende, falls das mit meinem Problem zu tuen haben sollte.

Code: Select all
RewriteEngine on
        RewriteOptions inherit
        RewriteCond %{REQUEST_URI} ^/?red
        RewriteRule (^/?red/)(.*) http://xyz.net/$2 [P]


        ProxyRequests Off
        <Proxy *:80>
                Order deny,allow
                Allow from all
        </Proxy>

        ProxyPass / http://docs.xyz.net:9000/
        ProxyPassReverse / http://docs.xyz.net:9000/
        ProxyPreserveHost On


Vielen Dank im Voraus

Florian H.
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby Nobbie » 16. February 2011 11:10

FlorianH wrote:ich scheitere seit zwei Tagen an dem Versuch in meinem Virtualhost den Host-Header eines Requests abhängig von einer Pattern in der Request_URI zu setzen


a) die Anweisungen in der .htaccess sind KEINE prozeduralen Sprachelemente, man kann nicht Umgebungsvariablen setzen und woanders abfragen. Es gelten nur die Werte zum Zeitpunkt des Requests und die neuen Werte werden bei Ausführung des Requests für den Prozess gesetzt

b) deswegen würde ich das so auch nicht machen. Mache einen richtigen Redirect auf den gewünschten host (im Prinzip die vorhandene RewriteRule übernehmen, aber den Proxy Flag weglassen. Übrigens ist die RewriteCond überflüssig, das ist doppelt gemoppelt, die RewriteRule hat ja das gleiche Pattern und damit die gleiche Bedingung) und erstelle einen eigenen VirtualHost für doc.xyz (und/oder docs.xyz.net, ich kann nicht erkennen, was Sinn der Aktion ist), wo Du den ReverseProxy unterbringst. Durch den Redirect wird der Requesthost explizit gesetzt.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 16. February 2011 11:48

Der Code ist direkt vom VirtualHost und nicht aus einer .htaccess. Da ich den ReverseProxy nutze komme ich garnicht auf eine Directory-Ebene.

Sinn des ganzen ist folgendes. Auf Port 9000 läuft ein WebServer bei dem ich keine Konfigurationsmöglichkeiten habe und der von "außen" quasi abgeschottet ist. Dieser Webserver reagiert nur auf die Domains "xyz.net" und "docs.xyz.net", beide in der /etc/hosts des WebServers auf 127.0.0.1 gemapped. Der Apache hört auf Port 80 und ist nur erreichbar durch die offizielle Adresse docs.xyz.net. Alle Requests sollen über den Proxy an Port 9000 weitergeleitet werden. Der Web-Server auf Port 9000 schickt aber ab und zu 3xx Responses an den Client zurück, die die Location "http://xyz.net/..." enthalten. Über diese Adresse ist aber keiner der beiden WebServer zu erreichen. Aufgrunddessen manipulier ich die Responses, was ich im Ausgangspost vergessen hab zu schreiben:

Code: Select all
Header edit Location http://xyz.net http://docs.xyz.net/red
Header edit Location http://www.xyz.net http://docs.xyz.net/red


Wichtig ist jetzt, dass am Apache ankommende Requests die mit "/red" in der Request_URI beginnen (das RegEx Pattern ist im Moment noch vereinfacht um das Testen zu erleichtern) so zu manipulieren, dass der Host-Header auf "xyz.net" geändert wird, per Mod_Rewrite das "red/" in der Uri zu entfernen und diesen Request per Proxy weiter an den WebServer an Port 9000 zu schicken.

Ich hoffe ich konnte meine Problemstellung nun etwas besser erläutern.
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby Nobbie » 16. February 2011 14:42

FlorianH wrote: Der Web-Server auf Port 9000 schickt aber ab und zu 3xx Responses an den Client zurück, die die Location "http://xyz.net/..." enthalten. Über diese Adresse ist aber keiner der beiden WebServer zu erreichen.


Das verstehe ich schon nicht - oben noch hast Du geschrieben, dass der Einstiegsserver unter xyz.net und docs.xyz.net zu erreichen ist. Was denn nun?

So oder so ist aber für solche Fälle, wo ein RedIrectHeader auf einen nicht erreichbaren Host die ProxyPassReverse Direktive zuständig. Die mappt ja genau rückwärts einen unerreichbaren Hostnamen auf ein (virtuelles) lokales Verzeichnis. Du könntest also so eine ProxyPassReverse Direktive zusätzlich noch angeben:

Code: Select all
ProxyPassReverse / http://xyz.net:9000/


Damit wird (neben docs.xyz.net) auch xyz.net auf den lokalen Root gemapped und durch die ProxyPass Anweisung wieder auf http://docs.xyz.net:9000/ geroutet. Das müßte es eigentlich schon sein. Alles andere ist Gemurkse.

Es gibt hier übrigens einen ausgezeichneten Artikel über ReverseProxys, da werden alle Problemfälle und Sonderfälle (nicht nur Response 302 etc., sondern auch harte Links usw.) abgehandelt: http://www.apachetutor.org/admin/reverseproxies

Das solltest Dir unbedingt bookmarken und sorgfältig durcharbeiten. Ein ganz tolles Tutorium, was wirklich jede Frage beantwortet.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 16. February 2011 15:02

Vielen dank, ich werd mir den Link mal durchlesen.
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby Nobbie » 16. February 2011 15:30

FlorianH wrote:Vielen dank, ich werd mir den Link mal durchlesen.


Unabhängig davon probier doch eben mal die o.g. Konfiguration aus. Meiner Meinung nach ist der Fall damit schon erledigt.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 16. February 2011 15:53

Also die Sache ist jetzt die. Ich versuche nocheinmal die Ausgangssituation zu erläutern: Der Rechner von dem ich Rede ist aus dem Internet unter der Adresse docs.xyz.net zu erreichen. Auf diesem Rechner befindet sich ein unbekannter WebServer ohne Konfigurationsmöglichkeiten der auf den Port 9000 hört (der später von außen nicht erreichbar sein wird, es ist nur Port 80 offen). Dieser Web-Server fühlt sich lokal unter den Namen docs.xyz.net und xyz.net angesprochen, sonst nichts (und damit der Rechner lokal die Adressen nicht über den DNS-Server auflöst wurde die /etc/hosts um die beiden Adressen und jeweils die 127.0.0.1 angepasst).
Greife ich nun auf diesen Rechner über seinen offiziellen Namen im Internet, also docs.xyz.net zu (d.h. über Port 9000, im produktiven Einsatz wird dieser Port geschlossen sein, das Beispiel dient nur zur Erläuterung), erreiche ich auch die Seite die unter der SubDomain docs.xyz.net erreichbar ist. Manipuliere ich den HTTP-Request auf dieser Adresse so, dass im Host xyz.net statt docs.xyz.net steht, komme ich auf die Seite die unter diesem WebServer unter xyz.net zu finden ist.

Auf dem selben Rechner wurde nun ein Apache2 Web-Server installiert mit einem VirtualHost unter Port 80. Dieser soll alle Requests über einen ReverseProxy an die Adresse docs.xyz.net:9000 weiterleiten. Das heißt, Die WebSeite, die man auf dem Rechner lokal unter xyz.net findet, soll von aussen "offiziell" (also jetzt mal von der Manipulation des Host-headers abgesehen) nicht erreichbar sein. Das problem ist jetzt, dass bei dem ersten Zugriff irgendeines Clients aus dem Internet auf die Adresse docs.xyz.net:80 der hintere WebServer auf Port 9000 einen 302-Redirect als Antwort schickt, den den Client auf die Seite xyz.net/?setCookie=1 weiterleitet. Das was aus dem Internet aber unter xyz.net zu finden ist, hat mit meinem Rechner und seinen WebServer absolut nicht zu tuen.

Jetzt habe ich mir den Link durchgelesen und kriege es immer noch nicht raus.

Code: Select all
        ProxyRequests off
        ProxyPreserveHost On
        ProxyPass / http://docs.xyz.net:9000/
        ProxyPass /red/ http://xyz.net:9000/

        ProxyPassReverse / http://docs.xyz.net:9000
        ProxyPassReverse /red/ http://xyz.net:9000


Unter den Direktiven stelle ich mir nun, stand meines bescheidenen Wissens, folgendes vor:
Kommt ein Request von außen (also auf docs.xyz.net:80/) wird er über den Proxy weitergeleitet (jetzt nicht im Sinne von 3xx) an http://docs.xyz.net:9000/. Das sollte diese Zeile sein:
Code: Select all
ProxyPass / http://docs.xyz.net:9000/


Antwortet der WebServer der unter Port 9000 liegt mit dem Host: docs.xyz.net, wird die URI so übernommen und an die Root URI rangehängt.
Code: Select all
ProxyPassReverse / http://docs.xyz.net:9000


Antwortet dieser WebServer jedoch mit dem Hostnamen xyz.net, wird vor die URI der Pfad "red/" angehängt (und ich schätze hier liegt schon ein Denkfehler):
Code: Select all
ProxyPassReverse /red/ http://xyz.net:9000


Sollte der Client eine Anfrage stellen die z.B. http://docs.xyz.net/red/index.html lautet, wandelt der Apache-Proxy diesen Request in die Form http://xyz.net/index.html um, so denke ich.
Code: Select all
ProxyPass /red/ http://xyz.net:9000/



Irgendwo jedoch scheine ich etwas vollkommen falsch zu verstehen, denn greife ich auf docs.xyz.net über das Internet zu, erhalte ich einen 302-Redirect auf die URL xyz.net/?blabla, was auf einen vollkommen unbeteiligten WebServer verweist. Was genau sehe ich hier falsch?
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby Nobbie » 16. February 2011 22:05

a) wieso testest nicht bitte einfach das, was ich Dir gepostet habe??

b) das hier ist doch offensichtlich Kappes:
Code: Select all
        ProxyPass / http://docs.xyz.net:9000/
        ProxyPass /red/ http://xyz.net:9000/


Die zweite ProyPass Direktive wird NIE ausgeführt, weil sie schon von der ersten Direktive auf http://docs.xyz.net:9000/red/ geroutet wird.

Also, nochmal zum Mitschreiben:

Code: Select all
        ProxyPass / http://docs.xyz.net:9000/

        ProxyPassReverse / http://docs.xyz.net:9000
        ProxyPassReverse / http://xyz.net:9000


Das ist alles. Bitte testen. Ist das zuviel verlangt?
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 17. February 2011 08:29

Auch hier bekomme ich auf einen GET-Request auf docs.xyz.net einen 302-Redirect als Response mit "Location:http://xyz.net/...".
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby Nobbie » 17. February 2011 09:12

FlorianH wrote:Auch hier bekomme ich auf einen GET-Request auf docs.xyz.net einen 302-Redirect als Response mit "Location:http://xyz.net/...".


Selbstverständlich - aber der wird dann auf docs.xyz.net weitergeleitet (bzw. "geproxyd").

P.S.: Ggf. musst Du in der ProxyPassReverse Direktive den Port 9000 durch 80 ersetzen (bzw. weglassen). Das kann ich aus der Beschreibung nicht 100%ig erkennen. Aber es schadet auch nicht, wenn Du einfach beide Varianten hineinschreibst.
Nobbie
 
Posts: 13183
Joined: 09. March 2008 13:04

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 17. February 2011 09:23

Nobbie wrote:
FlorianH wrote:Auch hier bekomme ich auf einen GET-Request auf docs.xyz.net einen 302-Redirect als Response mit "Location:http://xyz.net/...".


Selbstverständlich - aber der wird dann auf docs.xyz.net weitergeleitet (bzw. "geproxyd").


Eben nicht, das ist ja mein Problem. Die Domain xyz.net hat im Internet nichts mit dem Server zu tuen auf dem ich arbeite, die IP ist eine andere der Rechner ist eine andere, demzufolge werde ich nicht weitergeleitet. Nur auf meinem Server selbst ist die Domain xyz.net auf 127.0.0.1 umgeleitet. Wenn ich von einem anderen Server auf diese Domain gehe komme ich auf einen ganz anderen WebServer. Dementsprechend werde ich auch nicht "geproxyd".

Das problem ist jetzt, dass bei dem ersten Zugriff irgendeines Clients aus dem Internet auf die Adresse docs.xyz.net:80 der hintere WebServer auf Port 9000 einen 302-Redirect als Antwort schickt, den den Client auf die Seite xyz.net/?setCookie=1 weiterleitet. Das was aus dem Internet aber unter xyz.net zu finden ist, hat mit meinem Rechner und seinen WebServer absolut nicht zu tuen.
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 17. February 2011 09:32

Nobbie wrote:P.S.: Ggf. musst Du in der ProxyPassReverse Direktive den Port 9000 durch 80 ersetzen (bzw. weglassen). Das kann ich aus der Beschreibung nicht 100%ig erkennen. Aber es schadet auch nicht, wenn Du einfach beide Varianten hineinschreibst.


So scheint es zu funktionieren. Danke erstmal
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00

Re: "RequestHeader set" abhängig von Request_URI

Postby FlorianH » 18. February 2011 08:33

Leider habe ich mich zu früh gefreut (cache...). Die weiterleitung an sich funktioniert jetzt zwar, aber bei dem auf den 302-folgenden Request nach docs.xyz.net wird dieser nicht auf den Host xyz.net umgemapped. Die Folge davon ist, dass der WebServer auf Port 9000 wieder ein 302-Request rausschickt und ich so in eine Endlosschleife gelange.

Ich glaube immer noch das eine Direktive wie "ProxyPassReverse /red http://xyz.net" funktionieren würde, wenn ich die Möglichkeit hätte anhand der URI den Host-Header manuell zu setzen. Aber das scheint ja nicht zu funktionieren.
FlorianH
 
Posts: 8
Joined: 16. February 2011 10:00


Return to Apache

Who is online

Users browsing this forum: No registered users and 206 guests