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?0
et 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?0
dans la barre d'adresse et toutes les URL et contenus ultérieurs seraient servis avec le domaine du serveur Web et sans jellyfish
encombrement.
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 aller à l'URL racine ( http://web-server
) donne un 404 Not Found.
J'ai passé beaucoup de temps à essayer de l'utiliser mod_rewrite
avec et sans son [P]
drapeau pour contourner cela, mais sans succès. J'ai ensuite essayé la ProxyPassMatch
directive, 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_security
rè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/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 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 home
provenance 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.
ProxyPassMatch
par une utilisation équivalentemod_rewrite
, qui relève le défi de la suppressionjellyfish
des 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/