So konfigurieren Sie Apache als Reverse-Proxy mit dem in einem Abfragezeichenfolgenparameter angegebenen Remote-Server

So konfigurieren Sie Apache als Reverse-Proxy mit dem in einem Abfragezeichenfolgenparameter angegebenen Remote-Server

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 exprTeil 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.

verwandte Informationen