【问题标题】:How to configure which file extensions are served statically by Tomcat如何配置 Tomcat 静态提供哪些文件扩展名
【发布时间】:2014-04-11 10:20:22
【问题描述】:

在托管在 Tomcat 6 服务器上的现有 Java Web 应用程序中,我注意到所有以 .png.gif 等特定扩展名结尾的 URL 都是静态提供的,而如果我将扩展名替换为更奇特的东西,例如 @987654323 @ 然后它由一个 servlet 处理。

此文件扩展名列表在哪里配置?我检查了web.xmlserver.xml,但没有发现任何提及pnggif

【问题讨论】:

    标签: java tomcat hippocms


    【解决方案1】:

    只要没有定义 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 映射:&lt;mime-mapping&gt;&lt;extension&gt;eot&lt;/extension&gt;&lt;mime-type&gt;application/vnd.ms-fontobject&lt;/mime-type&gt;&lt;/mime-mapping&gt;。那么为什么它不像其他任何静态资源一样提供服务呢?
    • 如何提供服务?我猜你的意思不是下载,而是在浏览器中打开?
    【解决方案2】:

    嗯,实际上我的问题是特定于 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错误代码的问题。

    【讨论】:

      【解决方案3】:

      除了最佳解决方案@Stefoan 之外,Tomcat AS 还定义了映射到defaultDefaultServlet 作为名称,并在其上提供所有静态资源(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>
      

      【讨论】: