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 cortafuegos desactivado, si golpeas esta URL, Jetty carga la página de inicio de sesión. La barra de direcciones del navegador cambia correctamente a http://app-server:8181/jellyfish/login?0
y todo funciona.
Lo que quiero es para http://web-server
(es decir, desde la raíz) para asignar a Jetty en el servidor de aplicaciones con el nombre de la aplicación (jellyfish
) suprimido. p.ej. El navegador cambiaría para mostrar 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
y vaya a la URL raíz (http://web-server
) da un 404 No encontrado.
He pasado mucho tiempo intentando usar mod_rewrite
con y sin su [P]
marca para evitar esto, pero sin éxito. Luego probé la directiva ProxyPassMatch
, pero tampoco puedo entenderlo bien.
Aquí está la configuración actual, como se carga en /etc/Apache2/sites-available/
en el servidor web. Tenga en cuenta que hay un directorio de imágenes alojado localmente. También he mantenido el mod_rewrite proxy exploit protection y estoy suprimiendo un par de mod_security
reglas que daban falsos positivos.
<VirtualHost *:80>
ServerAdmin [email protected]
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 acerca de intentar acceder /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 acerca de intentar acceder /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 de dónde proviene el bit home
de la URL en el primer ejemplo.
¿Alguien puede señalarme en la dirección correcta, por favor?
Gracias J.
Así es como lo hice funcionar. Además de los cambios según mi comentario a mi pregunta original, necesitaba excluir .js
y .css
de la regla que agregó una barra diagonal final.
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName mydomain.com
ServerAlias www.mydomain.com
ErrorLog ${Apache_LOG_DIR}/error.log
LogLevel warn
CustomLog ${Apache_LOG_DIR}/access.log combined
RewriteLog ${Apache_LOG_DIR}/rewrite.log
RewriteLogLevel 9
Alias /images/ "/var/www/images/"
RewriteEngine On
# rewrite rule to prevent proxy exploit
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_URI} !^/
RewriteRule .* - [R=400,L]
# consolidate non-www requests onto the www subdomain
RewriteCond %{HTTP_Host} ^yourdomain\.com$
RewriteRule ^(.*) http://www.yourdomain.com/$1 [R=301,L]
# Add a trailing slash to the URL (ignoring images, CSS and JavaScript)
RewriteCond %{REQUEST_URI} !^/(images)(.*)$
RewriteCond %{REQUEST_URI} !^/(.*)(.js|.css)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://%{HTTP_Host}$1/ [R=301,L]
# 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/
# suppress mod_security rules that were giving false positives
SecRuleRemoveById 981059 981060
<Directory "/var/www/images">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Has probado:
ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181
O incluso más simplemente:
ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/
Escribí cómo trato con el proxy inverso de Apache y Tomcat por aquí si quieres comparar/contrastar lo que configuras con lo que uso.
Es posible que desee agregar esto para agregar una barra diagonal a la URL:
# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_Host}$1/ [R=301,L]