Puncte:2

Proxy o aplicație „port” pe adresa URL relativă („subdirector”) a aceluiași server în Apache 2.4?

drapel ci

Am mai văzut Cum să gestionați corect adresele URL relative cu un proxy invers - Cu toate acestea, am mari probleme în a înțelege acest lucru (și a-l aplica problemei mele), sper că cineva poate ajuta.

Să presupunem că am Ubuntu 20.04 ca sistem de operare pentru server pe serverul meu, exemplu.com.

Apoi, instalez https://github.com/hartwork/jawanndenn pe server și rulați-o - această aplicație rulează implicit pe portul 8080; și pot confirma că rulează pe serverul însuși, rulând:

wget -O- http://127.0.0.1:8080

Până acum, bine. Acum, ceea ce mi-aș dori, este că: în loc să accesez https://example.com:8080 pentru a accesa această aplicație, aș dori să accesez https://example.com/jaw - unde as suna de obicei /maxilar un „subdirector”, dar este poate mai precis o adresă URL relativă. Cu alte cuvinte, dacă înțeleg corect terminologia, https://example.com/jaw ar inversa proxy la https://example.com:8080.

Deci, am încercat să fac asta, în cadrul <VirtualHost *:443> definiție în mine .conf fişier:

  <Locație /maxilară>
    Opțiuni -Vizualizări multiple -Indexuri
    RewriteEngine Pornit
    ProxyPass http://127.0.0.1:8080
    ProxyPassReverse http://127.0.0.1:8080
    SetOutputFilter proxy-html
    ProxyHTMLURLMap http://127.0.0.1:8080
  </Locație>
  RewriteRule ^/jaw$ /jaw/ [R]

Acest lucru funcționează - în sensul că, pagina de pornire a aplicației este încărcată; dar o tonă întreagă de resurse (.css, .js) nu pot fi încărcate; deschizând consola în browserul meu, pot vedea o grămadă de solicitări 404 pentru:

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

Deci, cred că există câteva fișiere .js sau similare, care pur și simplu doresc să se încarce /static/... -> și dacă sunt chemați de la adresa „portului”, ar fi mapat către http://127.0.0.1:8080/static/... și totul ar fi bine; dar acum, din moment ce suntem proxy:

  • solicitările browserului https://example.com/jaw
  • Apache primește asta, îl transmite către https://example.com:8080, unde ascultă aplicația
  • Aplicația trimite înapoi fișiere (.js), care au link-uri în formular /static/...
  • Odată ce acestea ajung înapoi în browser, sunt interpretate ca https://example.com/static/... - înainte de a fi folosite ca cereri pentru server, care apoi nu le poate găsi

De asemenea, am încercat să scap de tot <Location> fragment de mai sus și doar folosind asta în <VirtualHost *:443> nodul:

  ProxyPass /jaw/ http://127.0.0.1:6789/
  ProxyPassReverse /jaw/ http://127.0.0.1:6789/

Exact la fel se întâmplă ca și anterior - prima pagină se încarcă, toate celelalte resurse aparent se referă la /static/... și toți 404.

În cele din urmă, am scăpat și de afirmațiile de mai sus și am folosit asta:

  ProxyPass /jaw/ http://127.0.0.1:8080
  ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
  <Locație /maxila/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080
    ProxyHTML Enable Activat
    ProxyHTMLURLMap / /jaw/
  </Locație>

Acesta are exact același comportament - prima pagină se încarcă, resursele eșuează - cu excepția faptului că resursele sunt acum listate în consola browserului ca:

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

... și eșuează cu 502 Proxy Error. Așa că s-au întâmplat unele rescrieri, dar ceva nu este încă în regulă.

Deci întrebarea mea este - cum pot spune lui Apache, să proxy Tot din aplicația pe 127.0.0.1:8080, la ceva care apare ca un „subdirector” (URL relativă? aici /maxilar)?


Editare: se pare că eroarea 502 proxy s-a datorat:

AH00898: Eroare de căutare DNS pentru: 127.0.0.1:6789static returnat de /poll/static/js/html.js

... atât de clar lipsește o bară oblică; deci s-a ajuns la asta:

  ProxyPass /jaw/ http://127.0.0.1:8080/
  ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
  <Locație /maxila/>
    ProxyPassReverse /
    ProxyPassReverse http://127.0.0.1:8080/
    ProxyHTML Enable Activat
    ProxyHTMLURLMap / /jaw/
  </Locație>

... de fapt funcționează - în cea mai mare parte ( /static resurse); dar apoi, există un apel la /date asta nu se ocupă de asta... Deci este încă o întrebare deschisă (pentru mine) cum să fac proxy "Tot"

drapel in
Configurați serverul backend cu adresa URL de bază corectă. Este mult mai ușor decât forțarea rescrierilor pe proxy.
sdbbs avatar
drapel ci
Mulțumesc @GeraldSchneider - asta m-a ajutat să realizez că această aplicație are un argument `--url-prefix` și care a sfârșit prin a funcționa pentru mine...
Puncte:3
drapel in

Configurați serverul backend cu adresa URL de bază corectă. Este mult mai ușor decât forțarea rescrierilor pe proxy.

Setarea ar trebui să fie JAWANNDENN_URL_PREFIX . Doar setează-l la /maxilar și toate adresele URL ar trebui să fie generate corect.

Primul exemplu ar trebui să funcționeze, chiar și fără ProxyHTMLURLMap și OutputFilter.

sdbbs avatar
drapel ci
Mulțumesc, am ajuns să folosesc `--url-prefix` pentru a specifica `JAWANNDENN_URL_PREFIX` la "`jaw`", și apoi doar `ProxyPass/ProxyPassReverse /jaw/ http://127.0.0.1:8080/jaw/` funcționează bine pentru proxy.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.