仅写 <link rel="icon" href="/favicon.ico"> 不够用,因 iOS Safari 完全忽略该标签而请求 /apple-touch-icon.png,Android PWA 要求明确 sizes="196x196" 的 PNG,Safari 不支持 SVG 通过 rel="icon" 加载,且各平台对 MIME 类型、尺寸精度和缓存处理严格。
直接放 /favicon.ico 到网站根目录,再加一行 <link rel="icon" href="/favicon.ico">,90% 的桌面浏览器就认了——但 iOS、Android PWA、高 DPI 屏和 Safari 会跳过它,必须额外配。
<link rel="icon" href="/favicon.ico"> 不够用这个写法对 Chrome/Firefox/Edge 桌面端基本稳,但实际有硬伤:
rel="icon",转而请求 /apple-touch-icon.png(哪怕你没声明)sizes="196x196" 的 PNG,.ico 文件里的 32×32 位图它不读rel="icon" 加载 SVG;Chrome/Firefox 虽支持,但需显式写 type="image/svg+xml"
type="image/png" 的 PNG 声明rel="apple-touch-icon" 必须单独配,且尺寸不能错这是 iOS 添加到主屏幕的唯一入口,不配就只能靠 Safari 截屏生成模糊图标:
apple-touch-icon.png,放在根目录最省事sizes 值必须和 PNG 实际像素完全一致:写 sizes="180x180" 就得是 180×180 像素,不是 181×180,也不是 180type 属性——苹果不认,加了反而可能干扰解析-precomposed 后缀;想保持原图样式,用 rel="apple-touch-icon-precomposed"
Content-Type 错了,图标再对也白搭浏览器收到响应后,会校验响应头里的 Content-Type。哪怕你上传的是完美无缺的 favicon-32x32.png,只要服务器返回 text/plain 或空着,Chrome 和 Firefox 就直接丢弃,控制台都不报错。
立即学习“前端免费学习笔记(深入)”;
favicon → 点开请求 → 查看 Response Headers 中的 Content-Type
types 块里加:image/x-icon ico;、image/png png;、image/svg+xml svg;
mod_mime 启用,并在 .htaccess 或虚拟主机配置中加:AddType image/x-icon .ico
mimetype
favicon 缓存是浏览器里最深的一层之一,常规清缓存经常无效:
chrome://settings/clearBrowserData → 勾选“缓存的图片和文件”,但更推荐直接开无痕窗口验证href 后加版本参数,比如 href="/favicon.ico?v=2" 或 href="/favicon-32.png?t=1715249520"
file:// 协议时,所有 favicon 都不会加载——这是浏览器限制,必须走 http:// 或 https://
public/favicon.ico 后,开发服务器热更新不触发 favicon 刷新,仍要手动清缓存或重启服务真正卡住的往往不是代码怎么写,而是图标文件是否真实可访问、服务器有没有返回正确的 MIME 类型、以及你正在用的浏览器是不是正抱着旧缓存不撒手。