W Apache mam odwrotną konfigurację proxy:
Serwer A z adresem www.example.com/folder to serwer odwrotnego proxy.
Mapuje na: Serwer B z adresem test.madeupurl.com
Ten rodzaj działa. Ale moim problemem jest to, że na www.example.com/folder wszystkie linki względne mają postać www.example.com/css/examplefilename.css, a nie www.example.com/folder/css/examplefilename. css
Jak to naprawić?
Jak dotąd mój zwrotny serwer proxy ma to na serwerze A (www.example.com):
<Location /folder>
ProxyPass http://test.madeupurl.com
ProxyPassReverse http://test.madeupurl.com
</Location>
linux
apache-2.2
reverse-proxy
Ciężko pracujący
źródło
źródło
Odpowiedzi:
Apache ProxyPassRewrite nie przepisuje treści odpowiedzi otrzymanych ze strony http://test.example.com , a jedynie nagłówki (takie jak przekierowania do strony 404 itp.).
Szereg alternatyw:
Jeden ) Przepisz aplikację wewnętrzną, aby używała ścieżek względnych zamiast bezwzględnych. tj.
../css/style.css
zamiast/css/style.css
Dwa ) Wdróż ponownie aplikację wewnętrzną w tym samym podkatalogu,
/folder
a nie w katalogu głównym test.example.com.Trzy ) Raz i dwa często się nie zdarzają ... Jeśli masz szczęście, wewnętrzna aplikacja używa tylko dwóch lub trzech podkatalogów i nie są one używane w Twojej głównej witrynie , po prostu napisz kilka wierszy ProxyPass:
Cztery ) Utwórz osobną subdomenę dla wewnętrznej aplikacji i po prostu odwróć wszystko proxy:
Pięć ) Czasami deweloperzy
są całkowicie nieświadomi imają swoje aplikacje generują nie tylko absolutny URL, ale nawet to część nazwy w ich URL i otrzymany kod HTML wygląda następująco:<img src=http://test.example.com/icons/logo.png>
.Odp. ) Możesz użyć rozwiązania kombi DNS DNS z podziałem horyzontu i scenariusza 4. Zarówno użytkownicy wewnętrzni, jak i zewnętrzni korzystają z witryny test.example.com, ale wewnętrzny serwer DNS wskazuje bezpośrednio adres IP serwera test.example.com. W przypadku użytkowników zewnętrznych rekord publiczny dla test.example.com wskazuje adres IP publicznego serwera internetowego www.example.com, a następnie można użyć rozwiązania 4.
B ) W rzeczywistości można uzyskać apache do nie tylko żądań proxy do test.example.com, ale także przepisać treść odpowiedzi, zanim zostanie ona przesłana do użytkowników. (Zwykle serwer proxy przepisuje tylko nagłówki / odpowiedzi HTTP). mod_substitute w apache 2.2. Nie testowałem, czy dobrze układa się z mod_proxy, ale może następujące działa:
źródło
<img src=/folder/icons/button.png>
które w kolej zostanie złapana przezProxyPass /folder/ http://test.madeupurl.com/folder/
dyrektywę.href="../css/custom.css"
a niehref="/css/custom.css"
. Gdy użytkownik Internetu pobierze stronę, adres URL będzie wynosić www.example.com/folder/content/index.html. Adres URL css będzie wtedy:www.example.com/folder/content/../css/custom.css
który faktyczniewww.example.com/folder/css/custom.css
zostanie przekazanytest.madeupurl.com/css/custom.css
.Jako uzupełnienie odpowiedzi HBruijn , jeśli zdecydujesz się na rozwiązanie (3) „ProxyPass”, być może będziesz musiał użyć mod_proxy_html do przepisania niektórych adresów URL na twoich stronach HTML.
por. Jak poprawnie obsługiwać względne adresy URL z odwrotnym proxy dla niektórych przykładów.
Jako zastosowany przykład, oto jak możesz skonfigurować Apache przy użyciu
ProxyHTMLURLMap
reguły, aby przekazywać wszystko z twoja-domena-nazwa.com/pad do instancji Etherpad działającej lokalnie na porcie 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]
źródło
SetOutputFilter
&ProxyHTMLURLMap
.Aby utworzyć odwrotne proxy, możesz użyć następującego sposobu:
1. Zainstaluj mod_proxy_html
Załaduj moduł mod_proxy_html
I użyj następującego ustawienia
Mam nadzieję, że to pomoże.
źródło