【发布时间】:2014-04-11 10:20:22
【问题描述】:
在托管在 Tomcat 6 服务器上的现有 Java Web 应用程序中,我注意到所有以 .png 或 .gif 等特定扩展名结尾的 URL 都是静态提供的,而如果我将扩展名替换为更奇特的东西,例如 @987654323 @ 然后它由一个 servlet 处理。
此文件扩展名列表在哪里配置?我检查了web.xml 和server.xml,但没有发现任何提及png 或gif。
【问题讨论】:
在托管在 Tomcat 6 服务器上的现有 Java Web 应用程序中,我注意到所有以 .png 或 .gif 等特定扩展名结尾的 URL 都是静态提供的,而如果我将扩展名替换为更奇特的东西,例如 @987654323 @ 然后它由一个 servlet 处理。
此文件扩展名列表在哪里配置?我检查了web.xml 和server.xml,但没有发现任何提及png 或gif。
【问题讨论】:
只要没有定义 servlet(-mapping),所有文件都是静态服务的。 mime 扩展在 Tomcat 的默认 web.xml 文件夹 /conf 中预定义:
<!-- ===================== Default MIME Type Mappings =================== -->
<!-- When serving static resources, Tomcat will automatically generate -->
<!-- a "Content-Type" header based on the resource's filename extension, -->
<!-- based on these mappings. Additional mappings can be added here (to -->
<!-- apply to all web applications), or in your own application's web.xml -->
<!-- deployment descriptor. -->
<mime-mapping>
<extension>123</extension>
<mime-type>application/vnd.lotus-1-2-3</mime-type>
</mime-mapping>
...
【讨论】:
eot 扩展名已经有一个 mime 映射:<mime-mapping><extension>eot</extension><mime-type>application/vnd.ms-fontobject</mime-type></mime-mapping>。那么为什么它不像其他任何静态资源一样提供服务呢?
嗯,实际上我的问题是特定于 Hippo CMS / Bloomreach Experience 配置(在我的项目中使用)。需要在/hst:hst/hst:hosts 节点下的hst:suffixexclusions 属性列表中添加一个.eot,如HippoCMS - Request Handling - Mount Matching 中所述。
您也可以将排除规则添加到site/src/main/webapp/WEB-INF/hst-config.properties 文件中:
filter.prefix.exclusions = /ping/, /fonts/
filter.suffix.exclusions = .eot, .woff, .woff2
这将解决Tomcat在大多数字体文件上返回HTTP 404错误代码的问题。
【讨论】:
除了最佳解决方案@Stefoan 之外,Tomcat AS 还定义了映射到default 的DefaultServlet 作为名称,并在其上提供所有静态资源(jpg、html、css、gif...)。 Here you can find it's documentation.
因此,您只需添加一个指向它的 servlet 映射,即可将某些自定义文件扩展名作为静态资源提供:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.eot</url-pattern>
</servlet-mapping>
【讨论】: