Configurer les liens symboliques pour un répertoire unique dans Tomcat
j'ai un répertoire dans lequel un processus envoie des fichiers .pdf
. Ce processus est hors de mon contrôle.
je dois rendre ces fichiers disponibles sur le site Web en utilisant Tomcat.
j'ai un répertoire /var/lib/tomcat5/webapps/test1
, disponible sur le web et je peux voir les fichiers à l'aide d'un navigateur.
donc, j'ai créé un lien symbolique pointant vers le répertoire avec les fichiers .pdf
:
/var/lib/tomcat5/webapps/test1/files/
, mais je ne vois pas rien dans ce répertoire.
Comment puis-je activer les liens symboliques uniquement dans le répertoire test1
? Je ne veux pas activer les liens symboliques partout, juste pour que le répertoire avec les fichiers .pdf
soit disponible sur le web.
6 réponses
il y a quelques problèmes avec la solution de créer un META-INF/context.xml
qui contient <Context path="/myapp" allowLinking="true">
le plus grand problème est que si un conf/context.xml
existe, le allowLinking
dans le <Context>
il prend priorité sur a <Context>
dans un META-INF/context.xml
. Et si le dans le conf/context.xml
ne définit pas explicitement allowLinking
, c'est la même chose que dire allowLinking="false"
. (voir ma réponse à une contexte question de priorité)
pour être sûr que votre application permet le lien, vous devez dire <Context override="true" allowLinking="true" ...>
.
un Autre problème est que le path="/myapp"
est ignoré dans une META-INF/context.xml
. Pour éviter la confusion, il est préférable de laisser tomber. La seule fois path
dans un <Context>
a un effet est dans le server.xml
, et le Tomcat docs officiels recommandent contre mettant <Context>
s dans un server.xml
.
enfin, au lieu d'un fichier myapp/META-INF/context.xml
, je recommande l'utilisation d'un fichier conf/Catalina/localhost/myapp.xml
. Cette technique signifie que vous pouvez garder le contenu de votre META-INF
propre, qui est les tripes de votre webapp -- Je n'aime pas risquer de mucking dans les tripes de mon webapp. :- )
créer un contexte.fichier xml dans un répertoire META-INF
dans 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 /
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 /
mkdir fichiers
mount --bind /chemin/vers/réel/upload/répertoire/fichiers fichiers
cela fonctionne différemment dans Tomcat 8+
http://tomcat.apache.org/migration-8.html
<Resources allowLinking="true" />
il y a 4 endroits où le contexte peut vivre.
- tomcatdir/conf/server.xml
- tomcatdir/conf / context.xml
- tomcatdir/conf/Catalina/localhost / appname.xml
- tomcatdir/webapps/appname/META-INF / context.xml
dans le cas de l'attribut tomcat 8 allowlinking doit être spécifié non pas dans le contexte mais dans L'étiquette Resources. Mon tomcatdir/conf/contexte.xml ressemble comme 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 très bien pour moi maintenant. Mais je veux aussi partager l'erreur que j'avais faite avant d'arriver à cette solution.
j'avais défini les ressources à la fois dans tomcatdir/conf/server.xml et dans tomcatdir/conf/contexte.XML. Et allowLinking= "true" n'a été défini que dans tomcatdir/conf/server.XML.
ce que j'ai trouvé était que si vous ne spécifiez pas allowLinking, c'est égal à la définir à false. J'ai donc enlevé Étiquette de ressources du serveur.xml et laissé seulement tomcatdir/conf/contexte.xml avec l'attribut allowLinking="true".
je l'ai fait de cette façon. Je modifie cet autre fichier de configuration: apache-tomcat-7.0.33/conf/ serveur .xml Dans Hôte tag j'ai ajouté:
<Context path="/data" docBase="C:\datos" debug="0" reloadable="true" crossContext="false"/>
ainsi, vous pouvez accéder via: http://localhost/data