Sto distribuendo Apache davanti a un'applicazione ospitata da Karaf (Apache e Karaf sono su server separati). Voglio che Apache funzioni come proxy inverso e anche per nascondere parte dell'URL.
L'URL per ottenere la pagina di accesso dell'applicazione direttamente dal server delle app è http://app-server:8181/jellyfish
. Le pagine sono servite dall'istanza Jetty in esecuzione all'interno di Karaf. Naturalmente, questo comportamento verrebbe normalmente bloccato dal firewall per tutto tranne il server proxy inverso.
Con il firewall spento, se si preme questo URL, Jetty carica la pagina di accesso. La barra degli indirizzi del browser cambia correttamente http://app-server:8181/jellyfish/login?0
e tutto funziona.
Quello che voglio è che http://web-server
(cioè dalla radice) per mappare a Jetty sul server app con il nome dell'app ( jellyfish
) soppresso. ad es. il browser cambierebbe per mostrarsi http://web-server/login?0
nella barra degli indirizzi e tutti gli URL e i contenuti successivi sarebbero offerti con il dominio del web server e senza il jellyfish
disordine.
Posso far funzionare Apache come un semplice proxy inverso, usando la seguente configurazione (snippet): -
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... ma questo richiede che l'URL del browser contenga jellyfish
e andando all'URL principale ( http://web-server
) si ottenga un 404 Not Found.
Ho trascorso molto tempo cercando di usare mod_rewrite
con e senza la sua [P]
bandiera per aggirare questo, ma senza successo. Ho quindi provato la ProxyPassMatch
direttiva, ma non riesco nemmeno a capire bene.
Ecco la configurazione corrente, così come viene caricata /etc/apache2/sites-available/
sul server web. Si noti che esiste una directory di immagini ospitata localmente. Ho anche mantenuto la protezione exploit proxy mod_rewrite e sto sopprimendo un paio di mod_security
regole che davano falsi positivi.
<VirtualHost *:80>
ServerAdmin admin@drummer-server
ServerName drummer-server
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /images/ "/var/www/images/"
RewriteEngine On
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_URI} !^/
RewriteRule .* - [R=400,L]
ProxyPass /images !
ProxyPassMatch ^/(.*) http://granny-server:8181/jellyfish/$1
ProxyPassReverse / http://granny-server:8181/jellyfish
ProxyPreserveHost On
SecRuleRemoveById 981059 981060
<Directory "/var/www/images">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Se vado a http://web-server
, vengo reindirizzato a http://web-server/jellyfish/home
ma questo dà un 404, con un reclamo sul tentativo di accedere /jellyfish/jellyfish/home
- NB la barra degli indirizzi del browser non contiene il doppio /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
E, se vado a http://web-server/login
, vengo reindirizzato a http://web-server/jellyfish/login?0
ma questo dà un 404, con una lamentela sul tentativo di accedere /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Quindi, immagino di dover in qualche modo passare attraverso le regole due volte. Sono anche leggermente confuso da dove home
provenga il bit dell'URL nel primo esempio.
Qualcuno può indicarmi la giusta direzione, per favore?
Grazie J.
ProxyPassMatch
con un uso equivalentemod_rewrite
, che affronta la sfida della rimozionejellyfish
dagli URL. Sto ora esaminando un numero di 404 che poi si aprono per quanto riguarda gli elementi sottostanti come i componenti di Wicket richiesti da Karaf. Ecco uno snippet di codice:# proxy to the Jellyfish server (ignoring images) RewriteCond %{REQUEST_URI} !^/(images)(.*)$ RewriteRule ^(/.*)$ http://app-server:8181/jellyfish$1 [P] ProxyPassReverse / http://app-server:8181/jellyfish/