Spring Boot 2.5 始终无法访问 favicon.ico

依据自己的常规经验,把 favicon.ico 放到public或static目录,本地环境正常识别并可以访问

$ curl -i 127.0.0.1:8080/favicon.ico
HTTP/1.1 200
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Last-Modified: Fri, 23 Jul 2021 01:24:22 GMT
Accept-Ranges: bytes
Content-Type: image/x-icon
Content-Length: 0
Date: Fri, 23 Jul 2021 01:25:52 GMT

然后到服务器之后就是各种404, 包括不限于放在以下目录都不行

resources/favicon.ico
resources/public/favicon.ico
resources/static/favicon.ico
resources/resources/favicon.ico
resources/META-INF/resources/favicon.ico

然后找到了一些资料,乱七八糟的那种,一无所获,直到看到 https://www.baeldung.com/spring-boot-favicon 才发现这个文件应该是被特殊处理了,控制器定义favicon.ico的方法肯定是会的,只是不想走到这一步。

根据上问提到的issue: https://github.com/spring-projects/spring-boot/issues/17925

猜测是spring单独屏蔽了这个文件,排查。

先提供解决方案,找个控制器,定义如下, 简单解决:

@Controller("FaviconController")
public class FaviconController {
    @RequestMapping(value = "/favicon.ico")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void faviconIco(HttpServletResponse response) {
        response.setHeader(HttpHeaders.CACHE_CONTROL, CacheControl.
                maxAge(Duration.ofDays(10L)).
                cachePublic().
                mustRevalidate().
                getHeaderValue());
        response.setHeader(HttpHeaders.CONTENT_TYPE, "image/x-icon");
    }
}

再次尝试成功

$ curl -i 127.0.0.1:8080/favicon.ico
HTTP/1.1 204
Cache-Control: max-age=864000, must-revalidate, public
Content-Type: image/x-icon
Date: Fri, 23 Jul 2021 02:02:08 GMT

具体原因分析:

  1. 第一点 spring.mvc.favicon.enabled 这个配置已经废弃,实际应该和这个无关

    {
    "name": "spring.mvc.favicon.enabled",
    "type": "java.lang.Boolean",
    "description": "Whether to enable resolution of favicon.ico.",
    "deprecated": true,
    "deprecation": {
        "level": "error"
    }
    }
  2. 为何 /favicon2.ico 也不能访问,而本地可以
    原因在于 favicon2.ico 这个图标的大小为0(空文件),本地和服务端的加载逻辑不一致导致空文件被忽略无法访问。

  3. 如果存放一个有效的favicon.ico(文件非空),则只需将文件放入public或static目录即可,不用过多处理

  4. 如何解决空文件访问问题, 参考 https://stackoverflow.com/questions/63562654/ 这里有同样的问题,本地正常,服务端不可用
    相关资源:

    1. https://zhuanlan.zhihu.com/p/346446044
    2. https://github.com/spring-projects/spring-boot/issues/16034
    3. https://github.com/spring-projects/spring-framework/issues/21372

总结: 无法访问 favicon.ico 的原因在于文件的大小为0,jar执行方式无法访问,可以通过自定义控制器的形式解决。空文件如何访问这个问题待具体分析, 可以参考上述资料和搜索其他内容

当前还没有任何评论

写下你最简单的想法