配置Tomcat中单个目录的符号链接。

29

我有一个目录,一个进程会上传一些 .pdf 文件到该目录。这个进程不在我的控制范围内。

我需要通过Tomcat在网站上提供这些文件。

我有一个目录/var/lib/tomcat5/webapps/test1可以被Web访问,并且我可以通过浏览器看到其中的文件。

因此,我创建了一个符号链接,指向具有 .pdf 文件的目录:/var/lib/tomcat5/webapps/test1/files/,但我无法看到该目录中的任何内容。

如何仅在test1目录中启用符号链接? 我不想在所有地方启用符号链接,只想让带有.pdf文件的目录对Web可用。

7个回答

54

创建一个包含<Context path="/myapp" allowLinking="true">META-INF/context.xml的解决方案存在一些问题。

最大的问题是,如果存在conf/context.xml,那么<Context>中的allowLinking将优先于META-INF/context.xml中的<Context>。如果在conf/context.xml中未明确定义allowLinking,则与说allowLinking="false"相同。(参见我的回答的上下文优先级问题)

为了确保您的应用程序允许链接,您必须说<Context override="true" allowLinking="true" ...>

另一个问题是,在META-INF/context.xml中忽略了path="/myapp"。为了避免混淆,最好将其省略。只有在server.xml中才会在<Context>中使用path,而官方Tomcat文档建议不要在server.xml中放置<Context>

最后,我建议使用conf/Catalina/localhost/myapp.xml文件,而不是myapp/META-INF/context.xml文件。这种技术意味着您可以保持META-INF的内容清洁,这是您的Web应用程序的核心--我不喜欢冒险在我的Web应用程序核心中搞砸。 :-)


1
大功告成!谢谢你啊。我得把它放到META-INF里,然后添加一个覆盖。(我认为在WEB-INF里行不通?) - dev
@piotr-czapla:感谢您编辑我的答案,修正了WEB-INF为META-INF! - netjeff
@beldaz:你应该创建一个新的问题(http://stackoverflow.com/questions/ask),而不是使用评论。 - netjeff
@netjeff 没关系,我问这个问题是为了让你的回答更完整,因为很多类似的问题都会忽略这个小问题,这会让像我这样的新手感到困惑。文件只需通过其完整的文件系统路径进行访问。 - beldaz
这个答案仍然允许在资源目录中找到任何符号链接,因此它并没有回答原始问题:“我不想启用到处都是符号链接,只是为了使带有 .pdf 文件的目录可用”。 - Ryan Bennetts
显示剩余3条评论

17

是的,我所要做的就是创建一个context.xml文件: /var/lib/tomcat5/webapps/test1/META-INF/context.xml那个链接非常有帮助。谢谢。 - jeph perro
谢谢。有没有想法如何配置Tomcat(6)始终跟随符号链接? - Tom Martin

8

是的,我知道这是一个老问题,但我找到了一个新的解决方案,使用mount并使用--bind选项而不是符号链接,tomcat不需要任何重新配置:

cd /var/lib/tomcat5/webapps/test1/

mkdir files

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


8

4

Context可以存在的地方有四个。

  1. tomcatdir/conf/server.xml
  2. tomcatdir/conf/context.xml
  3. tomcatdir/conf/Catalina/localhost/appname.xml
  4. tomcatdir/webapps/appname/META-INF/context.xml

如果使用Tomcat 8,应该将allowlinking属性指定在Resources标签中而不是Context中。我的tomcatdir/conf/context.xml看起来像这样:

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

这个解决方案现在对我来说很好用。但是在找到这个解决方案之前,我犯了一个错误,也想分享一下。
我在 tomcatdir/conf/server.xml 和 tomcatdir/conf/context.xml 中都定义了资源。而且 allowLinking="true" 只在 tomcatdir/conf/server.xml 中设置了。
我的发现是,如果您不指定 allowLinking,则相当于将其设置为 false。因此,我从 server.xml 中删除了 Resources 标签,并只在 tomcatdir/conf/context.xml 中保留了它,带有 allowLinking="true" 属性。

1
我用另一种方式实现了它。 我编辑了另一个配置文件: apache-tomcat-7.0.33/conf/server.xml主机标签中,我添加了以下内容:
<Context path="/data" docBase="C:\datos" debug="0" reloadable="true" crossContext="false"/>

因此,您可以通过以下方式访问:http://localhost/data


0
将以下行添加到conf/context.xml中,可以在Apache Tomcat 8.5+上启用软链接:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接