Vraag Hoe om te gaan met relatieve URL's correct met een omgekeerde proxy


Ik heb een omgekeerde proxy-setup als volgt in Apache:

Server A met adres www.example.com/map is de omgekeerde proxyserver.

Het verwijst naar: Server B met adres test.madeupurl.com

Dit soort werken. Maar het probleem dat ik heb is, op www.example.com/map, alle relatieve links zijn van de vormen www.example.com/css/examplefilename.css in plaats van www.example.com/folder/css/examplefilename. css

Hoe los ik dit op?

Tot nu toe heeft mijn reverse proxy dit op Server A (www.example.com):

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>

43
2017-12-17 12:05


oorsprong


Welke van de onderstaande oplossingen hebben voor u gewerkt in het antwoord van HBruijn, weet u het nog? - Kimberly W


antwoorden:


De Apache ProxyPassRewrite herschrijft de ontvangen antwoordorganen niet http://test.example.com, alleen headers (zoals doorverwijzingen naar een 404-pagina en dergelijke).

Een aantal alternatieven:

een) Herschrijf de interne app om relatieve paden te gebruiken in plaats van absolute paden. d.w.z. ../css/style.css in plaats van /css/style.css 

Twee) Plaats de interne app opnieuw in dezelfde subdirectory /folder in plaats van in de hoofdmap van test.example.com.

Drie) Eén en twee zijn vaak onwaarschijnlijk ... Als u geluk heeft, gebruikt de interne app slechts twee of drie submappen en die zijn ongebruikt op uw hoofdsite, schrijf gewoon een stel ProxyPass-regels:

# 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) Maak een apart subdomein voor de interne app en keer proxy alles gewoon terug:

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

Vijf) Soms ontwikkelaars zijn helemaal geen idee en laat hun applicaties niet alleen absolute URL's genereren, maar zelfs het hostname-gedeelte opnemen in hun URL's en de resulterende HTML-code ziet er als volgt uit: <img src=http://test.example.com/icons/logo.png>.

EEN) U kunt de gecombineerde oplossing van een gedeelde horizon DNS en scenario 4 gebruiken. Zowel interne als externe gebruikers gebruiken test.example.com, maar uw interne DNS verwijst rechtstreeks naar het ip-adres van de server van test.example.com. Voor externe gebruikers verwijst het openbare record voor test.example.com naar het ip-adres van uw openbare webserver www.example.com en u kunt vervolgens oplossing 4 gebruiken.

B) U kunt apache krijgen om niet alleen proxy-aanvragen naar test.example.com, maar ook herschrijf het antwoordorgaan voordat het naar uw gebruikers wordt verzonden. (Normaal gesproken herschrijft een proxy alleen HTTP-headers / responses). mod_substitute in apache 2.2. Ik heb niet getest of het goed samengaat met mod_proxy, maar misschien werken de volgende werken:

<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 koe, goed antwoord. Heb nog geen van deze geprobeerd, maar wilde je bedanken voor het schrijven! Helpt een miljoen. Ik ga een aantal van deze ideeën nu uitproberen en zal binnenkort verslag doen :) - Hard worker
Snelle vraag alstublieft, voor punt 2 als ik u goed begrijp, mijnheer, suggereert u dat ik de adpp opnieuw gebruik voor test.madeupurl.com/folder? Zou dit veranderingen in mijn apache-configuratiebestand vereisen? Dit lijkt de snelste oplossing - Hard worker
Bovendien, sorry dat ik u stoor, maar met punt 1 wanneer ik probeer wat u suggereert, blijft het probleem dat ik in mijn vraag beschrijf nog steeds bestaan. Hier gebruikte ik bijvoorbeeld: <link rel = "stylesheet" type = "text / css" href = "../ css / custom.css" /> en voor het link-adres in de browser die het uitvoert test.madeupurl.com/css/bootstrap.css liever dan test.madeupurl.com/folder/css/bootstrap.css. Zou u hier suggesties over hebben, dan zou dat zeer nuttig zijn - Hard worker
Wanneer u een toepassing die nu in de DocumentRoot is geïnstalleerd opnieuw implementeert naar een subdirectory zoals / map, worden vaak de stylesheets, pictogrammen enz. Geïmplementeerd in / map / css en / map / pictogrammen enz. Vervolgens worden koppelingen in de HTML-uitvoer als <img src=/folder/icons/button.png> die op zijn beurt zal worden gevangen door de ProxyPass /folder/ http://test.madeupurl.com/folder/ richtlijn. - HBruijn
De pagina test.madeupurl.com/content/index.html wil test.madeupurl.com/css/custom.css bevatten. Op die locatie moet u de relatieve URL gebruiken href="../css/custom.css" en niet href="/css/custom.css". Wanneer de internetgebruiker de pagina ophaalt, is de URL www.example.com/folder/content/index.html. De URL voor de CSS zal dan zijn: www.example.com/folder/content/../css/custom.css wat eigenlijk is www.example.com/folder/css/custom.css waarnaar wordt doorgestuurd test.madeupurl.com/css/custom.css. - HBruijn


Als aanvulling op HBruijn's antwoord, als je kiest voor een oplossing (3) "ProxyPass", moet u misschien ook gebruiken mod_proxy_html om enkele URL's in uw HTML-pagina's te herschrijven.

cf. Hoe om te gaan met relatieve URL's correct met een omgekeerde proxy voor enkele voorbeelden.

Als een toegepast voorbeeld, hier is hoe je Apache kunt configureren met behulp van de ProxyHTMLURLMap regel om alles door te sturen your-domain-name.com/pad aan jouw Etherpad bijvoorbeeld lokaal op poort 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



Houd er rekening mee dat mod_proxy_html alleen wordt opgenomen vanaf Apache 2.4 en hoger, waarbij de oorspronkelijke vraag hierboven voor Apache 2.2 is - HBruijn
Je antwoord is onberispelijk. Ik heb echter een geval ontmoet waarbij de inhoud geen html is, het is nogal pdf. Het gebruik van ProxyHTMLURLMap werkte niet voor mij. Eventuele andere suggesties? - Mohamed Ennahdi El Idrissi
Als uw inhoud een PDF is, hoeft u geen URL's erin te herschrijven! Tenzij u wilt dat uw gebruikers op links in de PDF klikken om toegang te krijgen tot andere pagina's van uw website, maar dit klinkt lastig. Om het herschrijven van URL's uit te schakelen, slaat u eenvoudig de laatste 2 richtlijnen weg: SetOutputFilter & ProxyHTMLURLMap. - Lucas Cimon


U kunt de volgende manier gebruiken om een ​​reverse proxy te maken:
1. Installeer mod_proxy_html

    yum install mod_proxy_html
  1. Laad mod_proxy_html module

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. En gebruik de volgende instelling

    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>  
    

Hoop dat dit helpt.


2
2018-05-08 08:52