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"