Estoy implementando Apache frente a una aplicación alojada en Karaf (Apache y Karaf están en servidores separados). Quiero que Apache funcione como un proxy inverso y que también oculte parte de la URL.
La URL para obtener la página de inicio de sesión de la aplicación directamente desde el servidor de aplicaciones es http://app-server:8181/jellyfish
. Las páginas son atendidas por la instancia de Jetty que se ejecuta dentro de Karaf. Por supuesto, este comportamiento generalmente sería bloqueado por el firewall para todo excepto el servidor proxy inverso.
Con el firewall desactivado, si aciertas esta URL, Jetty carga la página de inicio de sesión. La barra de direcciones del navegador cambia correctamente http://app-server:8181/jellyfish/login?0
y todo funciona.
Lo que quiero es que http://web-server
(es decir, desde la raíz) se asigne a Jetty en el servidor de aplicaciones con el nombre de la aplicación ( jellyfish
) suprimido. por ejemplo, el navegador cambiaría para mostrarse http://web-server/login?0
en la barra de direcciones y todas las URL y contenidos posteriores se servirían con el dominio del servidor web y sin el jellyfish
desorden.
Puedo hacer que Apache funcione como un proxy inverso simple, usando la siguiente configuración (fragmento):
ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/
... pero esto requiere que la URL del navegador contenga jellyfish
e ir a la URL raíz ( http://web-server
) da un 404 No encontrado.
He pasado mucho tiempo tratando de usar mod_rewrite
con y sin su [P]
bandera para evitar esto, pero sin éxito. Luego probé la ProxyPassMatch
directiva, pero tampoco puedo entenderlo bien.
Aquí está la configuración actual, como se carga en /etc/apache2/sites-available/
el servidor web. Tenga en cuenta que hay un directorio de imágenes alojado localmente. También mantuve la protección de exploits proxy mod_rewrite y estoy suprimiendo un par de mod_security
reglas que daban falsos positivos.
<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>
Si voy a http://web-server
, me redirigen a, http://web-server/jellyfish/home
pero esto da un 404, con una queja sobre el intento de acceso /jellyfish/jellyfish/home
: NB, la barra de direcciones del navegador no contiene el doble /jellyfish
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/home. Reason:
Not Found
Y, si voy a http://web-server/login
, me redirigen a, http://web-server/jellyfish/login?0
pero esto da un 404, con una queja sobre el intento de acceso /jellyfish/jellyfish/login
.
HTTP ERROR 404
Problem accessing /jellyfish/jellyfish/login. Reason:
Not Found
Entonces, supongo que de alguna manera estoy pasando las reglas dos veces. También estoy un poco desconcertado sobre el origen home
de la parte de la URL en el primer ejemplo.
¿Alguien puede señalarme en la dirección correcta, por favor?
Gracias J.
ProxyPassMatch
con un uso equivalentemod_rewrite
, que aborda el desafío de eliminarjellyfish
de las URL. Ahora estoy viendo una serie de 404 que luego aparecen con respecto a elementos subyacentes, como los componentes de Wicket requeridos por Karaf. Aquí hay un fragmento de código:# 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/