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.