15 votes

Réécriture d'URL Apache en proxy inverse

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

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

Avec le pare-feu désactivé, si vous accédez à cette URL, Jetty charge la page de connexion. La barre d'adresse du navigateur change correctement pour afficher http://serveur-de-l'application:8181/jellyfish/login?0 et tout fonctionne.

Ce que je veux, c'est que http://serveur-web (c.-à-d. à partir de la racine) soit mappé sur Jetty sur le serveur d'application avec le nom de l'application (jellyfish) supprimé. Par exemple, le navigateur doit afficher http://serveur-web/login?0 dans la barre d'adresse et toutes les URL et le contenu ultérieurs doivent être servis avec le domaine du serveur web et sans l'encombrement de jellyfish.

Je peux faire en sorte qu'Apache fonctionne comme un simple proxy inverse en utilisant la configuration suivante (extrait) :

ProxyPass /jellyfish http://serveur-de-l'application:8181/jellyfish
ProxyPassReverse / http://serveur-de-l'application:8181/

... mais cela nécessite que l'URL du navigateur contienne jellyfish et accéder à l'URL root (http://serveur-web) renvoie une erreur 404 non trouvé.

J'ai passé beaucoup de temps à essayer d'utiliser mod_rewrite avec ou sans son drapeau P pour contourner cela, mais sans succès. J'ai ensuite essayé la directive ProxyPassMatch, mais je n'ai pas réussi à 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 y a un répertoire d'images hébergé localement. J'ai également conservé la protection contre l'exploitation de proxy mod_rewrite et j'ai supprimé quelques règles mod_security qui donnaient des faux positifs.

    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-serveur:8181/jellyfish/$1
    ProxyPassReverse / http://granny-serveur:8181/jellyfish

    ProxyPreserveHost On

    SecRuleRemoveById 981059 981060

        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all

Si je vais sur http://serveur-web, je suis redirigé vers http://serveur-web/jellyfish/home mais cela renvoie une erreur 404, avec une plainte concernant la tentative d'accès à /jellyfish/jellyfish/home - NB la barre d'adresse du navigateur ne contient pas le double /jellyfish.

HTTP ERREUR 404

Problème d'accès à /jellyfish/jellyfish/home. Raison :

    Non trouvé

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

HTTP ERREUR 404

Problème d'accès à /jellyfish/jellyfish/login. Raison :

    Non trouvé

Donc, je suppose que je suis en train de passer à travers les règles deux fois de quelque manière. Je suis également un peu perplexe quant à l'origine de la partie home de l'URL dans le premier exemple.

Quelqu'un peut-il me mettre sur la bonne voie, s'il vous plaît ?

Merci, J.

11voto

Emily Points 1

C'est ainsi que j'ai réussi à le faire fonctionner. En plus des modifications selon mon commentaire sur ma question initiale, j'ai dû exclure .js et .css de la règle qui ajoutait une barre oblique finale.

    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]

    # Ajouter une barre oblique à l'URL (en ignorant les images, CSS et 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

            Options Indexes MultiViews FollowSymLinks
            AllowOverride None
            Order allow,deny
            Allow from all

1voto

Giacomo1968 Points 3512

Avez-vous essayé:

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

Ou même plus simplement:

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

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

Vous voudrez peut-être ajouter ceci pour ajouter une barre oblique à la fin de l'URL:

# Paramètres pour ajouter une barre oblique à la fin de l'URL
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ http://%{HTTP_HOST}$1/ [R=301,L]

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X