desarrollo-web-br-bd.com

Apache reescritura de URL en proxy inverso

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.

12
Jeremy Gooch

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>
10
Jeremy Gooch

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]
1
JakeGould