L'envoi de redirection dans d'applications web Tomcat derrière un proxy Apache 2 (mod_proxy)
J'ai une web application sur tomcat http://localhost:8080/WebApp/
La j'ai configrued Apache 2 (mod_proy), de sorte que l'application web est accessible directement par le localhost avec port de sortie et le nom de: e.g http://localhost
<VirtualHost localhost:80>
ProxyPreserveHost On
ProxyPass / http://localhost:8080/WebApp/
ProxyPassReverse / http://localhost:8080/WebApp/
</VirtualHost>
L'index.html s'affiche correctement sur http://localhost
.
Mais si un servlet redirections:
@WebServlet(description = "...", urlPatterns = { "/login" })
public class LoginServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
response.sendRedirect("a.html");
}
}
et j'utilise l'URL http://localhost/login
- je suis redirigé vers la http://localhost/WebApp/a.html
Comment puis-je obtenir la bonne redirection vers http://localhost/a.html
?
Vous devez déployer votre application en tant que root. J'ai ajouté le savoir-faire ci-dessous.
OriginalL'auteur Mahe | 2013-08-20
Vous devez vous connecter pour publier un commentaire.
Grâce à Stuart et son lien vers ce blog, j'ai trouvé une solution:
Proxy Inverse Des Applications Web Tomcat Derrière Apache
Solution: ProxyPreserveHost doit être désactivé!
Raison: Si il est allumé, les en-têtes de réponse renvoyé par le proxy backend contiennent “localhost” ou le vrai nom de domaine sans le numéro de port (ou 80). Si la directive ProxyPassReverse modèle ne correspond pas (en raison de la port différent et si un autre nom de domaine est utilisé, de même que le nom de domaine ne sera pas le match).
Config:
Mais cela ne fonctionne que via http, et non par ajp (je ne sais pas pourquoi).
Si vous voulez toujours utiliser ajp vous pouvez utiliser la solution de contournement suivante - qu'Apache ne une autre redirection après la mauvaise redirection:
La
ProxyPass /WebApp !
directive est nécessaire d'exclure le chemin de la poursuite du traitement dans le mod_proxy (parce que proxy directives sont évaluées avant les directives de redirection)Puis le
RedirectMatch
directives rediriger tout en indiquant avec/WebApp/...
respectivement/WebApp
à l'URL sans/WebApp
au début.Le seul inconvénient est que vous ne devez pas avoir un sous-dossier nommé
WebApp
dans votre application webOriginalL'auteur Mahe
J'ai aussi eu ce problème et a passé du temps sur elle. Je crois que si vous changez de configuration d'apache httpd pour la suite de votre redirection de travail:
C'est parce que le tomcat en-têtes de réponse contiendra le proxy en-têtes (c'est à dire l'Emplacement de l'en-tête est
http://localhost/WebApp
plutôt quehttp://localhost:8080/WebApp
) parce que ProxyPreserveHost est allumé.Comme une note de bas de page: Cela fonctionne aussi avec vous souhaitez modifier votre webapps contexte. Que vous vouliez changer le visible publiquement le contexte, vous pouvez utiliser les éléments suivants:
Pour la référence, j'ai trouvé ce blog très utile: Proxy Inverse Des Applications Web Tomcat Derrière Apache
Salut @Mahe, je suis content que cela vous a aidé à trouver une solution. Je pense que c'est une partie manquante de l'apache httpd documentation en ligne de la directive ProxyPassReverse et ProxyPreserveHost directives wrt agissant comme un proxy inverse. Apache httpd est souvent utilisé comme un reverse proxy et des applications web, qu'il agit comme un proxy inverse pour souvent ne sont pas sur le même serveur. Tous les exemples que j'ai pu trouver assumé le proxy et proxy machines a couru sur la même machine. Pour quiconque cherche à ce post, voir la documentation de apache httpd en tant que reverse proxy
Hey merci pour la note de bas de page sur le changement du contexte de la webapp. cela m'a vraiment aidé
OriginalL'auteur Stuart
vous avez l'utilisation de Connecteur AJP pour se connecter apache2 & tomcat , il sera le parfait solutions pour cela.
si vous avez besoin de la façon de configurer ce, dites-moi, je vais vous expliquer ce détail
ProxyPreserveHost On ProxyPass / ajp://localhost:8009/MobikatWebApp/ ProxyPassReverse / ajp://localhost:8009/MobikatWebApp/
c'est toujours le même problème...OriginalL'auteur Ramnath
Utiliser la redirection de la place de la redirection
Je pense que votre problème est l'utilisation de sendRedirect. L'appel de sendRedirect est effectivement supposer pour afficher le navigateur que l'URL a été redirigé. Si vous voulez cacher que vous avez besoin d'utiliser l'expédition.Dans votre servlet essayer ceci à la place de sendRedirect.
À l'intérieur de votre context.xml ensemble crossContext = "true" de sorte que vous pouvez transférer les demandes pour d'autres applications web.
Je ne comprends pas ce que tu veux dire par plusieurs sous-domaines. Voulez-vous dire par exemple
/login1
redirige vers/a.html
,/login2
redirige vers/b.html
,/login3
redirige vers/c.html
tout en étant redirigés par la même servlet?Non, le problème que j'ai décrit, c'est juste un sous-problème. J'ai un serveur Tomcat avec plusieurs applications. Je veux maintenant
app1.domain.net
point delocalhost:8080/app1/
etapp2.domain.net
àlocalhost:8080/app2
sur mon serveur. Je préfère les sous-domaines, car, il est plus facile de distribuer les applications plus tard sur plusieurs serveurs (si nécessaire)Je vois. Essayez la nouvelle méthode, j'ai juste ajouté. Si vous utilisez le transfert à la place de la redirection puis le navigateur ne sera pas obtenir la nouvelle URL. Il restera
/app1
et/app1/app1.html
restera caché.Belle possibilité de Tomcat. Je ne le savais pas avant! Mais ce n'est pas vraiment applicable à mon problème...
OriginalL'auteur Usman Mutawakil
J'ai eu le même problème tout essayé pour rediriger les apache2(en cours d'exécution sur le port 80) demande de tomcat(serveur d'application s'exécute sur le port 8080).
C'est la configuration qui fonctionne parfaitement.
Aller à
/etc/apache2/sites-available/000-default.conf
et ajoutez la configuration suivante:Fait.
Maintenant goto terminal et de frapper la commande suivante.
sudo a2enmod proxy_http
(pour la redirection http).sudo a2enmod proxy_wstunnel
(pour websocket redirection)sudo service apache2 restart
OriginalL'auteur Manik Maurya