web-dev-qa-db-fra.com

Configurer les liens symboliques pour un répertoire unique dans Tomcat

J'ai un répertoire dans lequel un processus télécharge des fichiers .pdf. Ce processus est hors de mon contrôle.

Je dois rendre ces fichiers disponibles sur le site Web à l'aide de Tomcat.

J'ai un répertoire /var/lib/Tomcat5/webapps/test1 disponible sur le Web et je peux voir les fichiers qu'il contient avec un navigateur.

J'ai donc créé un lien symbolique pointant vers le répertoire avec les fichiers .pdf: /var/lib/Tomcat5/webapps/test1/files/, mais je ne vois rien dans ce répertoire.

Comment puis-je activer les liens symboliques dans le répertoire test1 uniquement? Je ne veux pas activer les liens symboliques partout, juste pour que le répertoire avec les fichiers .pdf soit disponible sur le Web.

26
jeph perro

La solution consistant à créer un META-INF/context.xml contenant <Context path="/myapp" allowLinking="true"> pose quelques problèmes.

Le plus gros problème est que, si un conf/context.xml existe, la allowLinking du <Context> prend alors la précédence sur un <Context> dans un META-INF/context.xml. Et si le dans conf/context.xml ne définit pas explicitement allowLinking, cela revient à dire allowLinking="false". (voir ma réponse à une question de préséance du contexte)

Pour être sûr que votre application autorise la liaison, vous devez dire <Context override="true" allowLinking="true" ...>.

Un autre problème est que le path="/myapp" est ignoré dans un META-INF/context.xml. Pour éviter toute confusion, il est préférable de laisser tomber. La seule fois où path dans un <Context> a un effet est dans le server.xml et les documents officiels Tomcat déconseillent de mettre <Context>s dans un server.xml.

Enfin, au lieu d’un fichier myapp/META-INF/context.xml, je vous recommande d’utiliser un fichier conf/Catalina/localhost/myapp.xml. Cette technique signifie que vous pouvez garder le contenu de votre META-INF propre, ce qui est le courage de votre application Web - je n'aime pas risquer de perdre son temps dans les entrailles de mon application Web. :-)

49
netjeff

Créez un fichier context.xml dans un répertoire META-INF de votre application Web contenant:

<?xml version="1.0" encoding="UTF-8"?>

<Context path="/myapp" allowLinking="true">

</Context>

plus ici: http://www.isocra.com/2008/01/following-symbolic-links-in-Tomcat/

16
Loki

Oui, je sais que c'est une vieille question, mais j'ai trouvé une nouvelle solution, en utilisant mount avec l'option --bind au lieu d'un lien symbolique, et Tomcat n'a pas besoin de reconfiguration:

cd/var/lib/Tomcat5/webapps/test1 /

fichiers mkdir

mount --bind/path/to/actual/upload/directory/files fichiers

6
Mick

Cela fonctionne différemment dans Tomcat 8+

http://Tomcat.Apache.org/migration-8.html

<Resources allowLinking="true" />
4
weberjn

Il y a 4 endroits où le contexte peut vivre.

  1. tomcatdir/conf/server.xml
  2. tomcatdir/conf/context.xml
  3. tomcatdir/conf/Catalina/localhost/appname.xml
  4. rép_ tomcat/webapps/nom_app/META-INF/context.xml

Dans le cas de Tomcat 8, l'attribut allowlinking doit être spécifié non dans le contexte, mais dans la balise Resources. Mon tomcatdir/conf/context.xml ressemble à ceci 

<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
 <Resources allowLinking="true" cachingAllowed="true" cacheMaxSize="100000" />
</Context>

Cette solution fonctionne bien pour moi maintenant. Mais je veux aussi partager l’erreur que j’avais commise avant de proposer cette solution.

J'avais défini les ressources à la fois dans tomcatdir/conf/server.xml et dans tomcatdir/conf/context.xml. Et allowLinking = "true" a été défini uniquement dans tomcatdir/conf/server.xml. 

Ce que j’ai trouvé, c’est que si vous ne spécifiez pas allowLinking, cela revient à lui attribuer la valeur false. J'ai donc supprimé la balise Resources de server.xml et ne l'ai laissée que par tomcatdir/conf/context.xml avec l'attribut allowLinking = "true" qu'elle contient.

3
Nare

Je l'ai fait de cette autre manière. J'édite cet autre fichier de configuration: Apache-Tomcat-7.0.33/conf / server.xml Dans Host tag que j'ai ajouté:

<Context path="/data" docBase="C:\datos" debug="0" reloadable="true" crossContext="false"/>

Vous pouvez donc accéder via: http: // localhost/data

1
Alberto Perez

L’ajout de la ligne suivante dans le fichier conf/context.xml active les liens symboliques pour moi sur Apache Tomcat 8.5+.

< Ressources allowLinking = "true" cachingAllowed = "true" cacheMaxSize = "100000" >

0
gajanan malvade