Frage Wie behandeln Sie relative URLs korrekt mit einem Reverse-Proxy


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 entspricht: Server B mit Adresse test.madeupurl.com

Diese Art von Arbeiten. Aber das Problem, das ich habe, ist, auf www.example.com/folder, alle relativen Links sind von den Formularen www.example.com/css/examplefilename.css anstatt 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>

43
2017-12-17 12:05


Ursprung


Welche der folgenden Lösungen hat in HBruijns Antwort für Sie funktioniert, wenn Sie sich erinnern? - Kimberly W


Antworten:


Der Apache-ProxyPassRewrite überschreibt nicht die Antwortkörper, die von erhalten wurden http://test.example.com, nur Header (wie Weiterleitungen zu einer 404-Seite und so).

Eine Reihe von Alternativen:

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

Zwei) Stellen Sie die interne App erneut in demselben Unterverzeichnis bereit /folder anstatt in der Wurzel 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 sind auf Ihrer Hauptseite nicht verwendet, schreibe einfach eine Reihe von 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 reproxy einfach alles:

<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 Ihre Anwendungen generieren nicht nur absolute URLs, sondern enthalten sogar den Hostnamen-Teil in ihren URLs und der resultierende HTML-Code sieht folgendermaßen aus: <img src=http://test.example.com/icons/logo.png>.

EIN) Sie können Combo-Lösung eines 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 zeigt 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 tatsächlich Apache erhalten, um nicht nur Anfragen an test.example.com zu übertragen, sondern auch Schreiben Sie den Antworttext neu bevor es 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 gut mit mod_proxy stapelt, aber vielleicht funktioniert das Folgende:

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

68
2017-12-17 12:36



Heilige Kuh gute Antwort. Habe noch nicht einmal versucht, nur Danke für die Zuschreibung zu sagen! Hilft eine Million. Ich werde jetzt einige dieser Ideen ausprobieren und werde bald darüber berichten :) - Hard worker
Kurze Frage bitte, für Punkt 2, wenn ich Sie richtig verstehe, Herr, Sie vorschlagen, dass ich die adpp auf test.madeupurl.com/folder deployen? Würde dies Änderungen an meiner Apache-Konfigurationsdatei erfordern? Das sieht nach der schnellsten Lösung aus - Hard worker
Außerdem tut mir leid, Sie zu stören, aber mit Punkt 1, wenn ich versuche, was Sie vorschlagen, das Problem, das ich in meiner Frage beschreibe, besteht immer noch. Zum Beispiel habe ich hier: <link rel = "stylesheet" type = "text / css" href = "../ css / custom.css" /> und für die Linkadresse im Browser ausgegeben test.madeupurl.com/css/bootstrap.css eher, als test.madeupurl.com/folder/css/bootstrap.css. Hättest du irgendwelche Vorschläge dazu wäre es sehr hilfreich - Hard worker
Wenn Sie eine Anwendung, die jetzt im DocumentRoot installiert ist, in ein Unterverzeichnis wie / Ordner erneut bereitstellen, werden die Stylesheets, Icons usw. in / folder / css und / folder / icons usw. bereitgestellt. Dann werden Links in der HTML-Ausgabe ähnlich <img src=/folder/icons/button.png> welches wiederum von der. gefangen werden wird ProxyPass /folder/ http://test.madeupurl.com/folder/ Richtlinie. - HBruijn
Die Seite test.madeupurl.com/content/index.html möchte test.madeupurl.com/css/custom.css enthalten. An diesem Ort sollten Sie die relative URL verwenden href="../css/custom.css" und nicht href="/css/custom.css". Wenn der Internetbenutzer die Seite aufruft, lautet die URL www.example.com/folder/content/index.html. Die URL für das CSS lautet dann: www.example.com/folder/content/../css/custom.css was ist eigentlich www.example.com/folder/css/custom.css welches weitergeleitet wird an test.madeupurl.com/css/custom.css. - HBruijn


Als Ergänzung zu HBruijnAntwort, wenn Sie sich für eine Lösung entscheiden (3) "ProxyPass", müssen Sie möglicherweise auch verwenden mod_proxy_html Um einige URLs in Ihren HTML-Seiten neu zu schreiben.

vgl. Wie behandeln Sie relative URLs korrekt mit einem Reverse-Proxy für einige Beispiele.

Als Anwendungsbeispiel können Sie hier Apache mit Hilfe des ProxyHTMLURLMap Regel, um alles weiterzuleiten ihr-domainname.com/pad zu deinem Etherpad Instanz läuft lokal auf Port 9001:

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


7
2017-10-10 00:27



Beachten Sie jedoch, dass mod_proxy_html nur in Apache 2.4 und höher enthalten ist, wobei die ursprüngliche Frage oben für Apache 2.2 gilt - HBruijn
Deine Antwort ist tadellos. Allerdings traf ich einen Fall, wo der Inhalt nicht HTML ist, es ist eher pdf. Die Verwendung von ProxyHTMLURLMap funktionierte nicht für mich. Irgendwelche anderen Vorschläge? - Mohamed Ennahdi El Idrissi
Wenn es sich bei Ihrem Inhalt um ein PDF-Dokument handelt, müssen Sie die darin enthaltenen URLs nicht neu schreiben. Es sei denn, Sie möchten, dass Ihre Benutzer auf Links in der PDF-Datei klicken, um auf andere Seiten Ihrer Website zuzugreifen, aber das klingt knifflig. Um das Umschreiben von URLs zu deaktivieren, lassen Sie einfach die letzten 2 Anweisungen weg: SetOutputFilter & ProxyHTMLURLMap. - Lucas Cimon


Sie können folgenden Weg verwenden, um einen Reverse-Proxy zu 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 folgende Einstellung verwenden

    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.


2
2018-05-08 08:52