%20desselben%20Servers%20in%20Apache%202.4%20proxiesen%3F.png)
Ich habe gesehenSo handhaben Sie relative URLs mit einem Reverse-Proxy richtig- Ich habe jedoch große Probleme, dies zu verstehen (und auf mein Problem anzuwenden), hoffe, dass mir jemand helfen kann.
Nehmen wir an, ich habe Ubuntu 20.04 als Server-Betriebssystem auf meinem Server example.com
.
Dann installiere ichhttps://github.com/hartwork/jawanndennauf dem Server und führen Sie es aus – diese Anwendung läuft standardmäßig auf Port 8080; und ich kann bestätigen, dass sie auf dem Server selbst läuft, indem ich Folgendes ausführe:
wget -O- http://127.0.0.1:8080
So weit, so gut. Was ich jetzt möchte, ist: Anstatt https://example.com:8080
auf diese Anwendung zuzugreifen, möchte ich auf zugreifen https://example.com/jaw
– was ich normalerweise ein „Unterverzeichnis“ nennen würde /jaw
, aber es ist vielleicht genauer eine relative URL. Mit anderen Worten, wenn ich die Terminologie richtig verstehe, https://example.com/jaw
würde ich einen Reverse-Proxy zu verwenden https://example.com:8080
.
Also habe ich versucht, dies innerhalb der <VirtualHost *:443>
Definition in meiner .conf
Datei zu tun:
<Location /jaw>
Options -Multiviews -Indexes
RewriteEngine On
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
SetOutputFilter proxy-html
ProxyHTMLURLMap http://127.0.0.1:8080
</Location>
RewriteRule ^/jaw$ /jaw/ [R]
Dies funktioniert – in dem Sinne, dass die Startseite der Anwendung geladen wird; aber eine ganze Menge Ressourcen (.css, .js) können nicht geladen werden; wenn ich die Konsole in meinem Browser öffne, sehe ich eine Reihe von 404-Anfragen für:
https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...
Ich vermute also, dass es einige .js-Dateien oder ähnliches gibt, die einfach geladen werden möchten /static/...
-> und wenn sie von der „Port“-Adresse aus aufgerufen werden, würden sie dorthin abgebildet http://127.0.0.1:8080/static/...
und alles wäre in Ordnung; aber jetzt, da wir per Proxy arbeiten:
- Browseranfragen
https://example.com/jaw
- Apache erhält das, leitet es weiter an
https://example.com:8080
, wo die Anwendung lauscht - Die Anwendung sendet Dateien (.js) zurück, die Links im Formular enthalten
/static/...
- Sobald diese wieder im Browser ankommen, werden sie als
https://example.com/static/...
- interpretiert, bevor sie als Anfragen an den Server verwendet werden, der sie dann nicht finden kann
Ich habe auch versucht, den gesamten obigen Codeausschnitt zu entfernen <Location>
und nur Folgendes im <VirtualHost *:443>
Knoten zu verwenden:
ProxyPass /jaw/ http://127.0.0.1:6789/
ProxyPassReverse /jaw/ http://127.0.0.1:6789/
Es passiert genau das Gleiche wie zuvor – die erste Seite wird geladen, alle anderen Ressourcen verweisen anscheinend darauf /static/...
und bei allen kommt es zu einer 404-Fehlermeldung.
Schließlich habe ich auch die obigen Anweisungen entfernt und Folgendes verwendet:
ProxyPass /jaw/ http://127.0.0.1:8080
ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
Dies führt zu genau demselben Verhalten (die erste Seite wird geladen, Ressourcen schlagen fehl), außer dass Ressourcen jetzt in der Browserkonsole wie folgt aufgelistet werden:
https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...
... und sie schlagen mit 502 Proxy Error fehl. Es wurde also etwas umgeschrieben, aber irgendetwas stimmt immer noch nicht.
Meine Frage ist also: Wie kann ich Apache sagen, dass der Proxyallesvon der Anwendung auf 127.0.0.1:8080 zu etwas, das als „Unterverzeichnis“ erscheint (relative URL? hier /jaw
)?
Bearbeiten: Es stellte sich heraus, dass der Proxy-Fehler 502 folgende Ursache hatte:
AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js
... also fehlt eindeutig ein Schrägstrich, sodass das Ergebnis folgendermaßen lautet:
ProxyPass /jaw/ http://127.0.0.1:8080/
ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080/
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
... funktioniert tatsächlich - größtenteils (die /static
Ressourcen); aber dann gibt es einen Anruf, /data
der nicht davon behandelt wird ... Es ist also immer noch eine offene Frage (für mich), wie man einen Proxy verwendet "alles"
Antwort1
Konfigurieren Sie Ihren Backend-Server mit der richtigen Basis-URL. Das ist viel einfacher, als Neuschreibungen auf dem Proxy zu erzwingen.
Die Einstellung sollte lauten JAWANNDENN_URL_PREFIX
. Setzen Sie sie einfach auf /jaw
und alle URLs sollten ordnungsgemäß generiert werden.
Ihr erstes Beispiel sollte dann funktionieren, auch ohne ProxyHTMLURLMap und OutputFilter.