web-dev-qa-db-fra.com

Réécriture d'URL Apache en proxy inverse

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 depuis le 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?0 et tout fonctionne.

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

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 jellyfish et accède à l'URL racine (http://web-server) donne un 404 Not Found.

J'ai passé beaucoup de temps à essayer d'utiliser mod_rewrite avec et sans son [P] flag pour contourner ce problème, mais sans succès. J'ai ensuite essayé la directive ProxyPassMatch, mais je n'arrive pas à obtenir cela tout à fait correct non plus.

Voici la configuration actuelle, telle qu'elle est chargée dans /etc/Apache2/sites-available/ sur le serveur Web. Notez qu'il existe un répertoire d'images hébergé localement. J'ai également conservé protection contre les exploits du proxy mod_rewrite et je supprime quelques mod_security règles donnant 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/home mais 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?0 mais cela donne un 404, avec une plainte pour essayer d'accéder à /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 à l'origine du bit home de l'URL dans le premier exemple.

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

Merci, J.

12
Jeremy Gooch

C'est ainsi que je l'ai fait fonctionner. Outre les modifications apportées par mon commentaire à ma question d'origine, je devais exclure .js et .css de la règle qui a ajouté une barre oblique de fin.

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

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