Tomcat 8 Resources / PreResources 的区分大小写问题

Sco*_*ith 5 java windows configuration tomcat

首先,我们运行 Tomcat8、Java8 和 Windows Server 2012。

我们将图像、样式、JavaScript 和其他静态资源存储在我们的 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>
Run Code Online (Sandbox Code Playgroud)

此外,还有一个特定于站点的上下文,如下所示:

<Context docBase="${document.root}\sitename">
</Context>
Run Code Online (Sandbox Code Playgroud)

我们注意到对共享目录的一些请求有效,而另一些则无效。我发现它与文件名大小写有关。共享中的某些文件的名称以小写字母开头,有些文件以大写字母开头。那些具有小写名称的工作正常。所以为了测试一个理论,我对同一个文件名(一个不存在的)发出了两个请求,只改变了大小写,所以我可以看到 404 页面并看到实际使用的文件路径。

我首先请求了这个 URL:

{domain}/shared/Base.js
Run Code Online (Sandbox Code Playgroud)

得到的 404 页面表明 Tomcat 搜索了此路径:

/shared/base.js
Run Code Online (Sandbox Code Playgroud)

然后我请求了这个 URL:

{domain}/shared/base.js
Run Code Online (Sandbox Code Playgroud)

得到的 404 页面表明 Tomcat 搜索了此路径:

/shared/base.js
Run Code Online (Sandbox Code Playgroud)

如您所见,无论我在 URL 中使用什么大小写,它似乎都将其转换为小写。因此,如果我去重命名一个未能全部使用小写名称的文件,则一切正常。问题是这些是大目录,我们的目标是在不同步代码更新的情况下升级我们的服务器。此外,上传中的内容由我们的用户提交,除了确保唯一名称外,我们不会更改文件名,因此大小写将继续是随机的。有没有人知道我可以使用某些属性或配置让 Tomcat 完全按照 URL 中提供的文件名使用文件名?