Proxy und Rewrites

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

Proxy und Rewrites

Postby ObeY » 06. October 2006 10:55

Hallo zusammen,
ich habe ein Problem und komme aus eigener Kraft nicht mehr so richtig weiter. Daher versuche ich hier mein Problem mal zu schildern, in der Hoffnung jemand kann mir weiterhelfen.

Ausgangssituation:
IIS auf Port 9001
Apache auf Port 80

Der Apache dient nur als Proxy und soll bestimmte URLs manipuliert an den IIE weitergeben.
Der IIE ist zwingender Bestandteil meines Systems.
Da dieser nicht wirklich tolle URL Manipulationen zulässt habe ich ein Apache "vorangeschaltet" der diese Aufgabe übernehmen soll.

Also erstmal den Apache als Proxy defniniert

Code: Select all
<IfModule mod_proxy.c>
     ProxyPass / http://127.0.0.1:9001/
     ProxyPassReverse / http://127.0.0.1:9001/
</IfModule>


Jetzt sollen alle URL mit einenbestimmten Dateinamen an ein PHP script weitergeleitet werden wenn ein vorher fest definierter Parameter in der URL über GET mitgegeben wird.

Da der Apache nur als Proxy dienen soll, ist PHP im IIE verfügbar.

Beispiel
Anfrage
Code: Select all
http://meinserver/Webdienst1/web.ashx?mode=view

Der Proxy setzt es intern nach
Code: Select all
http://meinserver:9001/Webdienst1/web.ashx?mode=view

um.
Davon bekommt der Client nichts mit(was so auch gedacht wird).

Nun soll immer wenn eine web.ashx mit dem Paramter mode=view aufgerufen ist eine weiterleitung zu einen zentralen PHP File auf dem IIE stattfinden. Dazu soll im optimalfall der Verzeichnispfad mit als parameter übergeben werden.
z.b.
Code: Select all
http://meinserver/Webdienst1/web.ashx?mode=view
=>
http://meinserver:9001/script.php?path=/Webdienst1/&mode=view


Mein Problem tritt aber schon viel früher auf.
Per Rewrite versuche ich die URL zu ändern wenn das ashx File aufgerufen wird.

Code: Select all
RewriteRule ^/Webdienst1/web.ashx$  /Webdienst1/script.php?test=klappt


Er soll also aus
Code: Select all
http://meinserver/Webdienst1/web.ashx?mode=view

erstmal nur
Code: Select all
http://meinserver/Webdienst1/script.php?test=klappt

machen

Leider greift hier nicht mehr der Proxy der alles von Port 80 auf 9001 umlenken sollte.
Er sucht die PHP Datei im Apache Home Dir, z.b. C:\Programme\Apache\htdocs\Webdienst1\script.php?test=klappt (was natürlich nicht klappt da ja der IIE sein Home Dir auf c:\inetpub\ hat.

Warum wird also der Proxy bei Anfragen die per Rewrite bearbeitet werden ignoriert?

Dachte zuerst das die Reihenfolge in der httpd.conf ausschlaggebend ist.
Habe Rewrite- und Proxyanweisung mal getauscht, ohne erfolg.

Natürlich kann man das Http home Dir des Apaches auf das des IIS setzen oder aber man verwendet ihr Rewrite Anweisungen direkt die komplette URL zum IIS also http://meinserver:9001/ usw aber da der Server im Intranet und Internet verfügbar ist, würde ich nur ungern des Hostnamen/Weburl da fest eingeben.

Wenn ich das HTTP Dir des Apaches dann entsprechend setze, würde das ja auch bedeuten das PHP unter dem Apache genutzt wird und nicht unter dem IIE.

####################################

Das andere Problem das ich habe betrifft die Verwendung der Regulären ausdrücke in Rewrite Anweisungen.
Wie weiter oben schon beschrieben möchte ich alle Anfragen die den Parameter mode = view haben an ein PHP Script umlenken und den Pfad der aufgerufenen Datei als Parameter anhängen + weitere Get Parameter die womöglich vorhanden sind.

Z.B.
Code: Select all
http://meinserver/webdienst1/web.ashx?mode=view&name=hans

in
Code: Select all
http://meinserver/script.php?mode=view&name=hans&path=/webdienst1/

oder

Code: Select all
http://meinserver/webdienst22/web.ashx?max=55&mode=view&name=wurst

in
Code: Select all
http://meinserver/script.php??max=55&mode=view&name=wurst&path=/webdienst22/


Aber nur wenn der Parameter mode=view vorkommt.

Ich hab da schon einige Kombinationen ausprobiert aber nichts davon liefte auch nur annähernd das Ergebnis das ich gerne hätten :)
Bei Bedarf liefere ich meine fruchtlosen Versuche nach.

Danke vorab für die Unterstützung.

Gruß
Thomas
ObeY
 
Posts: 6
Joined: 04. October 2006 14:04

Postby Wiedmann » 06. October 2006 11:37

Da dieser nicht wirklich tolle URL Manipulationen zulässt

Wenn man das wirklich will und braucht, kann der IIS das genauso...

Code: Select all
ProxyPass / http://127.0.0.1:9001/
RewriteRule ^/Webdienst1/web.ashx$  /Webdienst1/script.php?test=klappt

Anstatt ProxyPass würd ich hier das Proxy-Flag in der RewriteRule setzen.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby ObeY » 06. October 2006 11:58

Wiedmann wrote:
Code: Select all
ProxyPass / http://127.0.0.1:9001/
RewriteRule ^/Webdienst1/web.ashx$  /Webdienst1/script.php?test=klappt

Anstatt ProxyPass würd ich hier das Proxy-Flag in der RewriteRule setzen.

Hallo Wiedmann,
vielen lieben Dank für den Hinweis.
Ein [P] war genau das was ich gebraucht habe.
Dann kann ich auch 127.0.0.1 verwenden.
Das löst auf einen Schlag die gesamte Problematik an der Stelle.

Trotzdem brauch ich das ProxyPass da ja nicht alle Anfragen über Rewrite abgedeckt werden.


Nachtrag zu meiner zweiten Frage:
Ich bin jetzt schonmal soweit gekommen das ich die Pfad als Variable anhängen kann, habe aber leider noch nicht ganz raus wie ich nach meinen Parameter suchen kann.

Code: Select all
RewriteRule ^/(.*)/web.ashx.(.*)$ http://127.0.0.1:9001/script.php?test=$1 [P]


Eigentlich will ich ja nach ^/(.*)/web.ashx(*mode=view*)$ suchen.
Den Ausdruck nimmt er aber so nicht an.
Dann dachte ich an web.ashx(.*)(.mode=view*)$ aber das mag er anscheinend auch nicht.

Bin für jeden Tip dankbar.
Ich teste derweil weiter und melde mich wenn ich weitergekommen bin.

Gruß
Thomas
ObeY
 
Posts: 6
Joined: 04. October 2006 14:04

Postby Wiedmann » 06. October 2006 12:05

Nachtrag zu meiner zweiten Frage

Zum "trocken" Testen kannst auch PHP und preg_replace() benutzen. Im PHP-Manual gibt' auch eine recht brauchbare Anleitung wie man man die PCRE-Library benutzt.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby ObeY » 06. October 2006 12:51

Danke erneut Wiedmann.
Ich vermute aber jetzt das Problem an einer anderen Stelle.
Kann es sein das man per Rewrite zwar die URL modifizieren kann aber auf die Parameter die über Get übergeben wurden kein Zugriff an der Stelle hat?
ObeY
 
Posts: 6
Joined: 04. October 2006 14:04

Postby Wiedmann » 06. October 2006 13:00

Kann es sein das man per Rewrite zwar die URL modifizieren kann aber auf die Parameter die über Get übergeben wurden kein Zugriff an der Stelle hat?

Kann nicht sein. 's gibt dabei aber ein paar Sachen zu beachten.
--> siehe im Apache-Manual die Hinweise bei der Directive rewrite_rule.
Wiedmann
AF Moderator
 
Posts: 17106
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby ObeY » 06. October 2006 13:19

Mein buch sagt dazu
Die Rewriting Engine splittet grundsätzlich den URL und einen eventuell vorhandenen Query String auf und fügt ihne später wieder an, wenn alle Modifikationen abgeschlossen sind


Dafür dient dann das Flag [QSA]

Ich habe aber an anderer Stelle noch die Möglichkeit gefunden den Query String mit %{QUERY_STRING} anzuhängen

Man kann die Parameter also wieder hinzufügen aber nicht ohne weiteres danach einschränken.

Ich vermute mal das man über RewriteCond vieleicht etwas machen kann und werde der Sache nachgehen :)

Danke

Gruß
Thomas
ObeY
 
Posts: 6
Joined: 04. October 2006 14:04

Postby ObeY » 06. October 2006 13:25

Ich lag mit meiner Vermutung richtig :)

RewriteCond %{QUERY_STRING} suchtext
danach halt den rest

Richtig einfach wenn man halbwegs verstanden hat wie man überhaupt ansetzen soll :)

Danke für die Hilfe
ObeY
 
Posts: 6
Joined: 04. October 2006 14:04

Postby ObeY » 20. October 2006 09:22

Ich hätte jetzt noch eine ergänzende Frage.

Ab und an bekomme ich einen Proxy Error 502 wenn ich eine Seite aufrufe.
Rufe ich diese Seite erneut auf, ist der Fehler verschwunden.

Die Apache Logs sagen dazu nicht viel.

Code: Select all
[Thu Oct 20 09:25:27 2005] [error] [client 10.106.155.58] proxy: error reading status line from remote server 127.0.0.1
[Thu Oct 20 09:25:27 2005] [error] [client 10.106.155.58] proxy: Error reading from remote server returned by /Test/Test.ashx


Zur Erinnerung:
Der Apache dient nur als Proxy(Leitet alle Anfragen auf Port 80, intern nach Port 9001 zu einen IIS um) mit einer Rewrite Anweisung.

Der Fehler tritt immer mal wieder auf.
Meist wenn ich das erste mal mit einen "Programmtyp" (IS, Mozilla, Opera, Firefox) einen aufruf mache. Danach kommt eine ganze Zeitlang jede Seite problemlos rüber.

Gruß
ObeY
 
Posts: 6
Joined: 04. October 2006 14:04


Return to Apache

Who is online

Users browsing this forum: No registered users and 2 guests