2010-03-16 14 views
6

Ich möchte eine Anfrage in Apache, basierend auf einem Anfrage-Header, an einen anderen Forward-Proxy weiterleiten. Ich denke, das Beste wäre, mod_rewrite zu verwenden, aber es kann nur einen Reverse-Proxy verwenden, der in der gleichen Apache-Konfiguration definiert ist.Apache Neuschreibanforderung mit einem anderen Forward-Proxy

Ich habe auch die ProxyRemote-Eigenschaft von mod_proxy überprüft, aber es kann nicht basierend auf Bedingungen verwendet werden, nur basierend auf Anfrage-URLs.

Ich brauche so etwas wie:

Wenn X-CUSTOM-Headers ist Wert-1 -> Vorwärts-Anfrage Proxy-p1 Wenn X-CUSTOM-Headers ist Wert-2 weiterleiten -> Vorwärts-Anfrage Proxy p2 weiterleiten

usw.

Din jemand geschafft, so etwas zu machen?

Danke, Alin

+0

Ich bin ein ähnliches Problem. Ich brauche auch eine Weiterleitungsanforderung und keine umgekehrte Anfrage, weil die Server selbst die Ressourcen nicht halten, sondern sie aus dem Internet holen sollten. Hast du schon eine Lösung gefunden? –

+0

diese Anforderung wurde schließlich entfernt, so hatte ich keine Chance, die Lösung in der Produktion zu testen. – Alin

Antwort

2

Ich fand eine Lösung, es ist nicht wirklich elegant. Es beinhaltet auch eine Anpassung auf dem zweiten Server.

Es stammt von einem Projekt, wo ich ein ähnliches Problem hatte, aber die Server benötigt, um "vollständig" (ausgewählt von einem benutzerdefinierten Skript, das Datenbankressourcen verwendet).

Dies sollte zumindest funktionieren (ich meine URL durch eine Neuschreibe-Karte ausführen, um es zu ändern, habe ich angepasst, um Header mit RewriteCond zu verwenden).

# example for server number "5" in your remote proxy network 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
RewriteRule http://([a-z0-9\.]+)/(.*) http://$1.5.server.yourdomain.com$1 [P] 
ProxyRemoteMatch .*\.5\.server\.yourdomain\.com.* http://5.server.yourdomain.com:80 

Sie passen die URL grundsätzlich so an, dass sie eine Subdomain Ihres zweiten Servers ist, und Sie entfernen sie dann wieder.
Dieser Teil geht auf dem zweiten (Remote-Proxy-Server):

<ProxyMatch "http://.*\.[0-9]+\.server\.yourdomain\.com/.*"> 
    RewriteEngine on 
    RewriteRule (proxy:http[s]?://.+)\.[0-9]+\.server\.premiumize\.me(.+) $1$2 
    ... your code ... 
</ProxyMatch> 
0

sollten Sie in der Lage sein, es mit% Überprüfung mithilfe der RewriteCond Richtlinie zu erreichen {HTTP: header}.

Versuchen Sie Folgendes:

RewriteEngine On 

RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
RewriteRule (.*) http://p1.example.com$1 [P] 
ProxyPassReverse/http://p1.example.com 

RewriteCond %{HTTP:X-CUSTOM-HEADER} 2 
RewriteRule (.*) http://p2.example.com$1 [P] 
ProxyPassReverse/http://p2.example.com 

Hoffe, es hilft. :)

+0

Dies ist elegant, aber der Fragesteller behauptet, dass er ein Forward-Proxy-Request benötigt. Daher sollten die Server p1 und p2 die Ressourcen von einer externen Quelle von Drittanbietern und nicht direkt von ihnen liefern. –

1

Try this:

# Prevents Apache from functioning as a forward proxy server (where you don't want) 
ProxyRequests Off 
# Preserve Host in http protocol on destination server 
ProxyPreserveHost On 
<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 
# enable rewrite engine 
RewriteEngine On 
# check header 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 1 
# execute forward proxy 
RewriteRule (.*) http://server1/$1 [P,L,QSA] 

# check header 
RewriteCond %{HTTP:X-CUSTOM-HEADER} 2 
# execute forward proxy 
RewriteRule (.*) http://server2/$1 [P,L,QSA]