Eine „Port“-Anwendung auf der relativen URL („Unterverzeichnis“) desselben Servers in Apache 2.4 proxiesen?

Eine „Port“-Anwendung auf der relativen URL („Unterverzeichnis“) desselben Servers in Apache 2.4 proxiesen?

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:8080auf 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/jawwürde ich einen Reverse-Proxy zu verwenden https://example.com:8080.

Also habe ich versucht, dies innerhalb der <VirtualHost *:443>Definition in meiner .confDatei 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:

  • Browseranfragenhttps://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 /staticRessourcen); aber dann gibt es einen Anruf, /datader 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 /jawund alle URLs sollten ordnungsgemäß generiert werden.

Ihr erstes Beispiel sollte dann funktionieren, auch ohne ProxyHTMLURLMap und OutputFilter.

verwandte Informationen