首先,我们正在运行Tomcat8,Java8和Windows Server 2012。
我们将图像,样式,JavaScript和其他静态资源存储在名为“shared”和“uploads”的Web应用程序之外的目录中。为了配置它,我创建了一个基本上下文,所有应用程序都是这样的:
<Context>
<Resources>
<PreResources base="${document.root}\shared" className="org.apache.catalina.webresources.DirResourceSet" webAppMount="/shared" />
<PreResources base="${document.root}\uploads" className="org.apache.catalina.webresources.DirResourceSet" webAppMount="/uploads" />
</Resources>
</Context>
此外,还有一个特定于站点的上下文,如下所示:
<Context docBase="${document.root}\sitename">
</Context>
我们注意到对共享目录的某些请求正在运行,而其他请求则没有。我发现它与文件名大小写有关。共享中的某些文件的名称以小写字母开头,而某些文件以大写字母开头。具有较小案例名称的那些工作正常。因此,为了测试一个理论,我对同一个文件名(一个不存在)提出了两个请求,只改变了大小写,所以我可以看到404页面并看到实际使用的文件路径。
我首先请求此网址:
{domain}/shared/Base.js
生成的404页面表示Tomcat搜索了此路径:
/shared/base.js
然后我请求了这个网址:
{domain}/shared/base.js
生成的404页面表示Tomcat搜索了此路径:
/shared/base.js
正如您所看到的,无论我在URL中使用哪种外壳,它似乎都将其转换为小写。因此,如果我将其中一个文件重命名为全部小写名称,则一切正常。问题是这些是大型目录,我们的目标是升级我们的服务器而不需要重复的代码更新。此外,上传内容由我们的用户提交,并且在确保唯一名称之外,我们不会更改文件名,因此外壳将继续随机。是否有人知道我可以使用某些属性或配置来使Tomcat完全按照URL中提供的方式使用文件名?