在 Tomcat 中为单个目录配置符号链接
Posted
技术标签:
【中文标题】在 Tomcat 中为单个目录配置符号链接【英文标题】:Configure Symlinks for single directory in Tomcat 【发布时间】:2010-09-23 19:49:42 【问题描述】:我有一个目录,进程将一些.pdf
文件上传到该目录。这个过程是我无法控制的。
我需要使用 Tomcat 通过网站提供这些文件。
我有一个可用于网络的目录/var/lib/tomcat5/webapps/test1
,我可以使用浏览器查看其中的文件。
所以,我创建了一个符号链接,指向包含.pdf
文件的目录:
/var/lib/tomcat5/webapps/test1/files/
,但我在那个目录中看不到任何东西。
如何仅在test1
目录中启用符号链接?我不想在任何地方启用符号链接,只是为了让带有.pdf
文件的目录对网络可用。
【问题讨论】:
【参考方案1】:创建包含<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"
一样。 (参见my answer 上下文优先问题)
要确保您的应用允许链接,您必须说<Context override="true" allowLinking="true" ...>
。
另一个问题是path="/myapp"
在META-INF/context.xml
中被忽略。为防止混淆,最好将其排除在外。 path
在<Context>
中唯一有任何影响的时间是在server.xml
中,而official Tomcat docs recommend against 将<Context>
s 放在server.xml
中。
最后,我推荐使用conf/Catalina/localhost/myapp.xml
文件,而不是myapp/META-INF/context.xml
文件。这种技术意味着您可以保持 META-INF
的内容干净,这是您的 web 应用程序的核心——我不喜欢冒险在我的 web 应用程序的核心中乱搞。 :-)
【讨论】:
大保存..谢谢伙计。我不得不将它放入 META-INF 并添加覆盖。 (我认为它在 WEB-INF 中不起作用?) @piotr-czapla:感谢您编辑我的答案以将 WEB-INF 修复为 META-INF! 如何从 Java 访问此路径中的文件?例如,如果我想为/var/lib/tomcat5/webapps/test1/files/example.pdf
创建一个 File 对象,那么给构造函数的路径字符串是什么?
@beldaz:您应该创建一个新问题 (***.com/questions/ask) 而不是使用 cmets。
@netjeff 没关系,我问是为了让你的答案更完整,因为许多类似的问题都忽略了这个让像我这样的菜鸟感到困惑的小问题。文件只需通过其完整的文件系统路径访问。【参考方案2】:
在您的 Web 应用程序的 META-INF
目录中创建一个 context.xml 文件,其中包含:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/myapp" allowLinking="true">
</Context>
更多:http://www.isocra.com/2008/01/following-symbolic-links-in-tomcat/
【讨论】:
是的,我所要做的就是创建一个 context.xml 文件:/var/lib/tomcat5/webapps/test1/META-INF/context.xml 该链接非常有用。谢谢。 谢谢。知道如何将 tomcat (6) 配置为始终遵循符号链接吗?【参考方案3】:这在 Tomcat 8+ 中的工作方式不同
http://tomcat.apache.org/migration-8.html
<Resources allowLinking="true" />
【讨论】:
【参考方案4】:是的,我知道这是一个老问题,但我找到了一个新的解决方案,将 mount 与 --bind 选项一起使用而不是符号链接,并且 tomcat 不需要任何重新配置:
cd /var/lib/tomcat5/webapps/test1/
mkdir 文件
mount --bind /path/to/actual/upload/directory/files 文件
【讨论】:
【参考方案5】:Context可以存在的地方有4个。
-
tomcatdir/conf/server.xml
tomcatdir/conf/context.xml
tomcatdir/conf/Catalina/localhost/appname.xml
tomcatdir/webapps/appname/META-INF/context.xml
在 tomcat 8 的情况下,allowlinking 属性不应在 Context 中指定,而应在 Resources 标签中指定。我的 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 中都定义了资源。并且仅在 tomcatdir/conf/server.xml 中设置了 allowLinking="true"。
我发现如果你不指定allowLinking它等于将它设置为false。所以我从 server.xml 中删除了 Resources 标签,只留下了带有 allowLinking="true" 属性的 tomcatdir/conf/context.xml。
【讨论】:
【参考方案6】:我是用另一种方式做到的。 我编辑这个其他配置文件:apache-tomcat-7.0.33/conf/server.xml 在 Host 标签中我添加了:
<Context path="/data" docBase="C:\datos" debug="0" reloadable="true" crossContext="false"/>
因此,您可以通过以下方式访问:http://localhost/data
【讨论】:
【参考方案7】:在 conf/context.xml 中添加以下行为我在 apache tomcat 8.5+ 上启用软链接
资源 allowLinking="true" cachingAllowed="true" cacheMaxSize="100000">
【讨论】:
以上是关于在 Tomcat 中为单个目录配置符号链接的主要内容,如果未能解决你的问题,请参考以下文章
配置文件图片的 Laravel Spark 符号链接不起作用