
Problem:
Ich versuche, Apache als Reverse-Proxy zu konfigurieren, wobei der entfernte Server in einem Abfragezeichenfolgenparameter angegeben wird.
Nehmen wir an, ich betreibe eine Website unter mywebapp.com. Wenn Sie zuhttp://mywebapp.com/proxy?url=http://www.someothersite.com, dann sollte Apache als Reverse-Proxy fungieren fürhttp://www.someothersite.com. Wenn Sie zuhttp://mywebapp.com/proxy?url=https://login.notmysite.com, dann sollte Apache als Reverse-Proxy fungieren fürhttps://login.notmysite.com.
Überlegungen:
1. Schreiben Sie relative URLs in der Antwort-HTML neu, damit sie über den Proxy laufen.
2. Schreiben Sie Umleitungsantworten vom Remote-Server neu. Wenn der Benutzer beispielsweise mywebapp.com/proxy?url= anfordert,https://login.notmysite.comund der Remote-Server antwortet mit einer Umleitung aufhttps://login.notmysite.com/, dann sollte der Browser des Benutzers eine Weiterleitung zu mywebapp.com/proxy?url= sehen.https://login.notmysite.com/.
3. Unterstützt http und https
4. Unterstützt Cookies
5. Angemessene Sicherheit. Ich möchte keinen Proxy öffnen, den jeder auf der Welt verwenden kann – er sollte nur in einem Iframe auf der Site verwendet werden, die unter mywebapp.com gehostet wird.
Umfeld:
Ich verwende Apache 2.2.24, kann aber ein Upgrade durchführen, wenn sich das Problem dadurch leichter lösen lässt.
Aktuelle Konfiguration:
<VirtualHost 127.0.0.1:8081>
ServerName www.mywebapp.com
SSLProxyEngine On
RewriteEngine on
RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^/proxy - [E=url:%1]
RewriteCond %{QUERY_STRING} ^url=(https?://[^:/]+)/?
RewriteRule ^/proxy - [E=url_host:%1]
RewriteCond %{QUERY_STRING} ^url=(.*)$
RewriteRule ^/proxy %1 [P]
ProxyPassInterpolateEnv On
ProxyPassReverse /proxy/ ${url_host} interpolate
<Location /proxy>
ProxyHTMLEnable On
ProxyHTMLInterp On
ProxyHTMLURLMap / ${url_host}/ V
RequestHeader unset Accept-Encoding
</Location>
</VirtualHost>
Diese Konfiguration scheint für Überlegung Nr. 1 ordnungsgemäß zu funktionieren, aber bei Überlegung Nr. 2 stoße ich auf ein Hindernis. Ich weiß, dass Sie Weiterleitungen normalerweise mit dem Befehl ProxyPassReverse handhaben, aber ich bin nicht sicher, wie ich ihn dazu bringe, den Abfragezeichenfolgenparameter neu zu schreiben.
Fragen:
Ist Apache angesichts dieser Überlegungen ein geeignetes Tool zur Lösung dieses Problems?
Wenn ja, wie richte ich die Konfiguration für Apache ein, um alle oben genannten Überlegungen zu berücksichtigen?
Ich weiß, das ist eine große Frage. Wenn Sie eine Antwort beitragen können, die mir hilft, auch nur eine der Überlegungen zu berücksichtigen, aktualisiere ich die obige Konfiguration, damit die Community sie sehen kann.
Antwort1
mod_headers kann dies möglicherweise bewältigen.
Header set Location http://mywebapp.com/proxy?%{url}e expr="resp('Location') =~ /.*/"
Das expr
Teil erfordert Apache 2.4.
Hinweis: Ich habe dies nicht getestet.
Verweise:
http://httpd.apache.org/docs/2.4/mod/mod_headers.html http://httpd.apache.org/docs/2.4/expr.html
Antwort2
Vielleicht löst es sich mitPfundwäre einfacher und sicherer. Dann ist es aber kein Redirect, sondern ein Reverse-Proxy.
Auch ein kleines PHP-Skript könnte die Aufgabe erledigen ...
Antwort3
Das größte Problem bei Ihrer Idee besteht darin, dass Sie erwarten, dass der Reverse-Proxy Cookies an das Backend sendet, der Client jedoch keine Cookies an das Frontend sendet (es sei denn, die Cookie-Domäne des Backends wäre der des Frontends untergeordnet).
Ich würde sagen, dass die Verwendung von mod_proxy wahrscheinlich zu schwierig ist und dass Sie in diesem Fall mit mod_rewrite schneller ans Ziel kommen.
... aber ich denke, Sie versuchen wahrscheinlich, ein Problem mit einem wahrscheinlich fehlerhaften Design zu lösen. Wenn Sie das Problem, das Sie mit dieser Lösung lösen möchten, näher erläutern können, können wir vielleicht etwas Klareres vorschlagen.