Apache reescritura de URL en proxy inverso

12

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?0y 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?0en la barra de direcciones y todas las URL y contenidos posteriores se servirían con el dominio del servidor web y sin el jellyfishdesorden.

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 jellyfishe ir a la URL raíz ( http://web-server) da un 404 No encontrado.

He pasado mucho tiempo tratando de usar mod_rewritecon y sin su [P]bandera para evitar esto, pero sin éxito. Luego probé la ProxyPassMatchdirectiva, 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_securityreglas 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/homepero 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?0pero 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 homede la parte de la URL en el primer ejemplo.

¿Alguien puede señalarme en la dirección correcta, por favor?

Gracias J.

Jeremy Gooch
fuente
He progresado un poco en esto, y ahora lo he reemplazado ProxyPassMatchcon un uso equivalente mod_rewrite, que aborda el desafío de eliminar jellyfishde 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/
Jeremy Gooch

Respuestas:

10

Así es como lo hice funcionar. Además de los cambios según mi comentario a mi pregunta original, tenía que excluir .jsy .cssde la regla que agregaba una barra inclinada final.

<VirtualHost *:80>
    ServerAdmin admin@localhost
    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>
Jeremy Gooch
fuente
1

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 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]
JakeGould
fuente
Muchas gracias por la respuesta. Desafortunadamente, esto solo resuelve la parte más directa del problema. Lo que me falta es cómo eliminar la palabra "medusa" de la visibilidad en la barra de direcciones del navegador del cliente, de modo que http://web-serversilenciosamente se http://app-server:8181/jellyfishvuelva proxy y viceversa.
Jeremy Gooch