Réécriture d'URL Apache en proxy inverse

12

Je déploie Apache devant une application hébergée par Karaf (Apache et Karaf sont sur des serveurs séparés). Je veux qu'Apache fonctionne comme un proxy inverse et masque également une partie de l'URL.

L'URL pour obtenir la page de connexion de l'application directement à partir du serveur d'applications est http://app-server:8181/jellyfish. Les pages sont servies par l'instance Jetty exécutée dans Karaf. Bien sûr, ce comportement est généralement bloqué par le pare-feu pour tout sauf le serveur proxy inverse.

Avec le pare-feu désactivé, si vous appuyez sur cette URL, Jetty charge la page de connexion. La barre d'adresse du navigateur se transforme correctement en http://app-server:8181/jellyfish/login?0et tout fonctionne.

Ce que je veux, c'est http://web-server(c'est-à-dire à partir de la racine) mapper à Jetty sur le serveur d'applications avec le nom de l'application ( jellyfish) supprimé. Par exemple, le navigateur changerait pour s'afficher http://web-server/login?0dans la barre d'adresse et toutes les URL et contenus ultérieurs seraient servis avec le domaine du serveur Web et sans jellyfishencombrement.

Je peux faire fonctionner Apache comme un simple proxy inverse, en utilisant la configuration suivante (extrait): -

ProxyPass /jellyfish http://app-server:8181/jellyfish
ProxyPassReverse / http://app-server:8181/

... mais cela nécessite que l'URL du navigateur contienne jellyfishet aller à l'URL racine ( http://web-server) donne un 404 Not Found.

J'ai passé beaucoup de temps à essayer de l'utiliser mod_rewriteavec et sans son [P]drapeau pour contourner cela, mais sans succès. J'ai ensuite essayé la ProxyPassMatchdirective, mais je n'arrive pas non plus à la comprendre.

Voici la configuration actuelle, telle qu'elle est chargée /etc/apache2/sites-available/sur le serveur Web. Notez qu'il existe un répertoire d'images hébergé localement. J'ai également conservé la protection contre les exploits du proxy mod_rewrite et je supprime quelques mod_securityrègles qui donnaient des faux positifs.

<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 je vais à http://web-server, je suis redirigé vers http://web-server/jellyfish/homemais cela donne un 404, avec une plainte pour essayer d'accéder /jellyfish/jellyfish/home- NB la barre d'adresse du navigateur ne contient pas le double /jellyfish.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/home. Reason:

    Not Found

Et, si je vais à http://web-server/login, je suis redirigé vers, http://web-server/jellyfish/login?0mais cela donne un 404, avec une plainte concernant la tentative d'accès /jellyfish/jellyfish/login.

HTTP ERROR 404

Problem accessing /jellyfish/jellyfish/login. Reason:

    Not Found

Donc, je suppose que je suis en quelque sorte en train de passer par les règles deux fois. Je suis également légèrement perplexe quant à la homeprovenance du bit de l'URL dans le premier exemple.

Quelqu'un peut-il m'orienter dans la bonne direction, s'il vous plaît?

Merci, J.

Jeremy Gooch
la source
J'ai fait des progrès à ce sujet et je l'ai maintenant remplacé ProxyPassMatchpar une utilisation équivalente mod_rewrite, qui relève le défi de la suppression jellyfishdes URL. J'examine maintenant un certain nombre de 404 qui apparaissent ensuite en ce qui concerne les éléments sous-jacents tels que les composants Wicket requis par Karaf. Voici un extrait de code:# 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

Réponses:

10

C'est ainsi que je l'ai fait fonctionner. En plus des modifications selon mon commentaire à ma question d'origine, je devais exclure .jset .cssde la règle qui ajoutait une barre oblique.

<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
la source
1

As-tu essayé:

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

Ou encore plus simplement:

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

J'ai écrit comment je gère le proxy inverse Apache et Tomcat ici si vous souhaitez comparer / contraster ce que vous avez configuré avec ce que j'utilise.

Vous pouvez ajouter ceci pour ajouter une barre oblique de fin à l'URL:

# Settings for adding a trailing slash to the URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]
JakeGould
la source
Merci beaucoup pour la réponse. Malheureusement, cela ne résout que la partie proxy directe du problème. Le peu qui me manque est de savoir comment supprimer le mot «méduse» de la visibilité dans la barre d'adresse du navigateur du client, de sorte que le http://web-serverproxy soit silencieusement inversé http://app-server:8181/jellyfish.
Jeremy Gooch