So handhaben Sie relative URLs mit einem Reverse-Proxy richtig

So handhaben Sie relative URLs mit einem Reverse-Proxy richtig

Ich habe in Apache einen Reverse-Proxy wie folgt eingerichtet:

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

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

Das funktioniert irgendwie. Aber mein Problem ist, 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 Reverseproxy auf Server A (www.example.com) Folgendes:

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

Antwort1

Der Apache ProxyPassRewrite schreibt die Antworttexte nicht um, die vonhttp://test.example.com, 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.cssanstelle von/css/style.css

Zwei) Stellen Sie die interne App im selben Unterverzeichnis erneut bereit, /foldernicht 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 Unterverzeichnisseund 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 Subdomäne für die interne App und verwenden Sie für alles einfach einen Reverse-Proxy:

<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 sind Entwickler völlig ahnungslos und ihre Anwendungen generieren nicht nur absolute URLs, sondern schließen sogar den Hostnamenteil in ihre URLs ein, und der resultierende HTML-Code sieht folgendermaßen aus: <img src=http://test.example.com/icons/logo.png>.

A) Sie können eine Kombinationslösung aus Split Horizon DNS 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 Eintrag für test.example.com auf die IP-Adresse Ihres öffentlichen Webservers.www.beispiel.comund Sie können dann Lösung 4 verwenden.

B) Sie können Apache tatsächlich dazu bringen, nicht nur Anfragen an test.example.com weiterzuleiten, sondern auchSchreiben Sie den Antworttext neubevor es an Ihre Benutzer übertragen wird. (Normalerweise schreibt ein Proxy nur HTTP-Header/Antworten um). mod_substitute in Apache 2.2. Ich habe nicht getestet, ob es sich gut mit mod_proxy kombinieren lässt, 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>

Späte Bearbeitung

Sechs) Manchmal stellen Entwickler spezielle Anwendungseinstellungen speziell für Bereitstellungen bereit, bei denen sich die Anwendung hinter einem Reverse-Proxy befindet.Die Anwendung kann dann so konfiguriert werden, dass sie selbstreferenzielle URLs mit dem Protokoll, dem Site-Namen und dem URI-Pfad generiert, den Benutzer verwenden/verwenden sollten, anstattdann der Hostname, das Protokoll und/oderdie URI, die die Anwendung erkennt. Erwarten Sie Begriffe wie external URL, site URL. Dann müssen Sie in Apache nichts lösen.

Antwort2

Als Ergänzung zuHBruijn's Antwort, wenn Sie sich für Lösung entscheiden(3)"ProxyPass", müssen Sie möglicherweise auchmod_proxy_htmlum einige URLs in Ihren HTML-Seiten umzuschreiben.

vgl.So handhaben Sie relative URLs mit einem Reverse-Proxy richtigfür einige Beispiele.

Als angewandtes Beispiel können Sie Apache mit der ProxyHTMLURLMapRegel konfigurieren, alles anihr-domainname.com/padzu IhremEtherpadInstanz, die lokal auf Port 9001 läuft:

<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]

Antwort3

Sie können einen Reverse-Proxy folgendermaßen erstellen:
1. Installieren Sie mod_proxy_html

    yum install mod_proxy_html
  1. Modul mod_proxy_html laden

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. Und verwenden Sie 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.

verwandte Informationen