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.
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>
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]