it-swarm.com.de

Wie man mit relativen URLs mit einem Reverse-Proxy richtig umgeht

Ich habe ein Reverse-Proxy-Setup wie folgt in Apache:

Server A mit der Adresse www.example.com/folder ist der Reverse-Proxy-Server.

Es ist zugeordnet: Server B mit der Adresse test.madeupurl.com

Diese Art von Arbeiten. Das Problem, das ich habe, ist jedoch, dass auf www.example.com/folder alle relativen Links die Form www.example.com/css/examplefilename.css haben und nicht www.example.com/folder/css/examplefilename. CSS

Wie behebe ich das?

Bisher hat mein Reverse-Proxy dies auf Server A (www.example.com):

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>
56
Hard worker

Der Apache ProxyPassRewrite schreibt die von http://test.example.com empfangenen Antwortkörper nicht neu, sondern nur Header (wie Weiterleitungen zu einer 404-Seite und dergleichen).

Eine Reihe von Alternativen:

Eins ) Schreiben Sie die interne App neu, um relative Pfade anstelle von absoluten zu verwenden. d.h. ../css/style.css Anstatt von /css/style.css

Zwei ) Stellen Sie die interne App erneut in demselben Unterverzeichnis bereit /folder anstatt im Stammverzeichnis von test.example.com.

Drei ) Eins und zwei sind oft unwahrscheinlich ... Wenn Sie Glück haben, verwendet die interne App nur zwei oder drei Unterverzeichnisse und diese werden auf Ihrer Hauptseite nicht verwendet, schreiben Sie einfach ein paar ProxyPass-Zeilen:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

Vier ) Erstellen Sie eine separate Subdomain für die interne App und kehren Sie einfach alles um:

<VirtualHost *:80>
   ServerName app.example.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://test.internal.example.com/
   ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

Fünf ) Manchmal Entwickler sind völlig ahnungslos und Lassen Sie ihre Anwendungen nicht nur absolute URLs generieren, sondern sogar den Hostnamen in ihre URLs aufnehmen, und der resultierende HTML-Code sieht folgendermaßen aus: <img src=http://test.example.com/icons/logo.png>.

[~ # ~] a [~ # ~] ) Sie können die Kombinationslösung eines DNS mit geteiltem Horizont und Szenario 4 verwenden. Sowohl interne als auch externe Benutzer verwenden test.example.com, aber Ihr interner DNS verweist direkt auf die IP-Adresse des Servers von test.example.com. Für externe Benutzer verweist der öffentliche Datensatz für test.example.com auf die IP-Adresse Ihres öffentlichen Webservers www.example.com, und Sie können dann Lösung 4 verwenden.

[~ # ~] b [~ # ~] ) Sie können Apache tatsächlich dazu bringen, nicht nur Proxy-Anfragen an test.example.com zu senden, sondern auch Schreiben Sie den Antworttext neu, bevor er an Ihre Benutzer übertragen wird. (Normalerweise schreibt ein Proxy nur HTTP-Header/-Antworten neu.) mod_substitute in Apache 2.2. Ich habe nicht getestet, ob es mit mod_proxy gut stapelt, aber vielleicht funktioniert Folgendes:

<Location /folder/>
  ProxyPass http://test.example.com/
  ProxyPassReverse http://test.example.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>
86
HBruijn

Als Ergänzung zu HBruijn 's Antwort müssen Sie möglicherweise, wenn Sie sich für die Lösung (3) "ProxyPass" entscheiden Verwenden Sie auch mod_proxy_html , um einige URLs in Ihren HTML-Seiten neu zu schreiben.

vgl. Wie man relative URLs mit einem Reverse-Proxy richtig behandelt für einige Beispiele.

Als angewandtes Beispiel können Sie Apache mithilfe der Regel ProxyHTMLURLMap konfigurieren, um alles unter your-domain-name.com/pad an Ihre - weiterzuleiten. Etherpad Instanz, die lokal auf Port 9001 ausgeführt wird:

<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]

9
Lucas Cimon

Sie können einen Reverse-Proxy auf folgende Weise erstellen:
1. Installieren Sie mod_proxy_html

    yum install mod_proxy_html
  1. Laden Sie das Modul mod_proxy_html

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. Und verwenden Sie die folgende Einstellung

    ProxyRequests off  
    ProxyPass /folder/  http://test.madeupurl.com  
    ProxyHTMLURLMap http://test.madeupurl.com  /folder  
    
    <Location /folder/>  
        ProxyPassReverse /  
        ProxyHTMLEnable On  
        ProxyHTMLURLMap  /  /folder/  
        RequestHeader    unset  Accept-Encoding  
    </Location>  
    

Ich hoffe das hilft.

5
ThanhHH