在springboot中我把要显示的网站图标放在/pitlog/src/main/resources/static/favicon.ico 下,测试发现直接访问首页面不能正常找到favicon.ico图标,但是如果先使用https://www.ylycom.cn/favicon.ico 访问正常取得图标后,再重新访问https://www.ylycom.cn 正常了。



后来发现如果直接访问ico图标能正常访问,不管理http或者https,也就是说ico图标是能正常访问的。

这是正常的浏览器(或 CDN 边缘)对 /favicon.ico 的「负缓存(negative cache)」行为,不是你代码的问题,也不是 favicon 本身还在缓存旧图——而是之前那次 404 被缓存了。
发生了什么
时间线还原:
- 早期某次部署/访问时,
/favicon.ico在服务器上还没就位(或被边缘节点返回了 404)。浏览器在加载首页时隐式请求/favicon.ico,拿到 404。
- 浏览器对 favicon 的 404 结果会长期缓存——它记住“这个网站没有图标”,之后访问首页既不显示图标、也不再重新请求。这就是你“首页一直找不到”的原因。
- 当你手动在地址栏访问
https://www.ylycom.cn/favicon.ico时,这本质是一个普通文档请求(不是 favicon 子资源请求),服务器返回 200(图片)。关键在这里:Chrome 发现/favicon.ico这次返回的是合法图标,会顺手用它刷新了该域名的 favicon 缓存,清掉之前的“无图标”记忆。
- 于是再回首页,图标就正常了。
> 你之前截图里那个 146 字节 text/html 的 404,正是这次被缓存的 404 响应(很像 Nginx 默认 404 页)。而直接访问能 200,说明服务器现在是对的。
两种负缓存来源(都符合你的现象)
- 浏览器负缓存(最常见):Chrome/Edge 对 favicon 的 404 缓存很久,且只有“重新拿一次 200”才会刷新。
- CDN 边缘节点负缓存:
www.ylycom.cn这种公网域名通常挂 CDN。边缘曾缓存过一次 404(短 TTL),你直接打favicon.ico命中源站拿到 200 并刷新了边缘缓存,所以首页随后也 200 了。
结论与建议
- 代码侧无需改:文件在
static/favicon.ico、已打包、WebConfig白名单放行、pom 无过滤,都正确。
- 这只影响“已经缓存过那次 404 的浏览器”。新访客(或清掉站点数据后)首次进首页就会正常 404→200 拿到图标,不会复现。
- 想更稳妥、不再依赖浏览器那条隐式请求,可在
layout.html的<head>显式声明:
<link rel="icon" type="image/x-icon" th:href="@{/favicon.ico}">这样浏览器按声明确定性地去取图标,减少“首页隐式 favicon 请求 404 被缓存”的偶发情况(也可改用你已有的 logo.svg)。
要的话我直接帮你把上面这行 <link rel="icon"> 加到 layout.html 头部。