Riscrittura URL Apache in proxy inverso


12

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?0e 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?0nella barra degli indirizzi e tutti gli URL e i contenuti successivi sarebbero offerti con il dominio del web server e senza il jellyfishdisordine.

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 jellyfishe andando all'URL principale ( http://web-server) si ottenga un 404 Not Found.

Ho trascorso molto tempo cercando di usare mod_rewritecon e senza la sua [P]bandiera per aggirare questo, ma senza successo. Ho quindi provato la ProxyPassMatchdirettiva, 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_securityregole 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/homema 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?0ma 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 homeprovenga il bit dell'URL nel primo esempio.

Qualcuno può indicarmi la giusta direzione, per favore?

Grazie J.


Ho fatto alcuni progressi su questo, e ora ho sostituito ProxyPassMatchcon un uso equivalente mod_rewrite, che affronta la sfida della rimozione jellyfishdagli 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/
Jeremy Gooch,

Risposte:


10

È così che l'ho fatto funzionare. Oltre alle modifiche come da mio commento alla mia domanda originale, ho dovuto escludere .jse .cssdalla regola che ha aggiunto una barra finale.

<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>

1

Hai provato:

ProxyPassMatch ^/(.*) http://granny-server:8181/$1
ProxyPassReverse / http://granny-server:8181

O ancora più semplicemente:

ProxyPass / http://granny-server:8181/
ProxyPassReverse / http://granny-server:8181/

Ho scritto come gestisco il proxy inverso di Apache e Tomcat qui se si desidera confrontare / confrontare ciò che si configura con quello che uso.

Potresti voler aggiungere questo per aggiungere una barra finale all'URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]

Molte grazie per la risposta. Sfortunatamente, questo risolve solo la parte semplice del proxy. Un po 'che mi manca è come rimuovere la parola "medusa" dalla visibilità nella barra degli indirizzi del browser del client, in modo tale che http://web-servervenga silenziosamente inviato il proxy http://app-server:8181/jellyfishe viceversa .
Jeremy Gooch,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.