依据自己的常规经验,把 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
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
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");
}
}
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
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
具体原因分析:
-
第一点
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"
}
} -
为何
/favicon2.ico
也不能访问,而本地可以
原因在于favicon2.ico
这个图标的大小为0(空文件),本地和服务端的加载逻辑不一致导致空文件被忽略无法访问。 -
如果存放一个有效的
favicon.ico
(文件非空),则只需将文件放入public或static目录即可,不用过多处理 -
如何解决空文件访问问题, 参考 https://stackoverflow.com/questions/63562654/ 这里有同样的问题,本地正常,服务端不可用
相关资源:
总结: 无法访问 favicon.ico 的原因在于文件的大小为0,jar执行方式无法访问,可以通过自定义控制器的形式解决。空文件如何访问这个问题待具体分析, 可以参考上述资料和搜索其他内容
当前还没有任何评论