Reference
favicon.ico 该放哪里?根路径惯例
按照由来已久的惯例,即便没有 link 标签指向它,浏览器和许多爬虫也会从你域名的根目录请求 /favicon.ico。所以一个在站点根目录提供的 favicon.ico,是那个能满足一切按路径请求的东西的唯一文件。你把它实际放在哪里因技术栈而异(大多数框架放在 public/,Next.js 放在 app 目录),但它最终必须能在 /favicon.ico 上应答。
那个没人声明的根请求
即便你的 head 里根本没有 icon link,浏览器、订阅阅读器和爬虫仍会在域名最根部请求 /favicon.ico。这是一个先于 link 标签存在的隐式请求,而很多客户端依赖它。
这就是为什么这个文件必须在根路径解析。你的 link 标签覆盖其余的一切(SVG、各种 PNG 尺寸、apple-touch-icon),但这一个 URL 无论你是否指向它都会被请求。
各技术栈中文件放在哪里
| 技术栈 | 把文件放进 |
|---|---|
| Plain HTML | 站点根目录,在 /favicon.ico 提供 |
| Vite / React / Vue | public/,会被复制到根目录 |
| Next.js App Router | app 目录(app/favicon.ico) |
| WordPress | 站点图标设置,而不是你上传的一个文件 |
| Angular | public/,或在 angular.json 的 assets 中列出 |
Favicon 路径常见问题
我把 favicon.ico 放哪里?
放在能让它在 /favicon.ico 提供的地方:纯 HTML 放站点根目录,大多数框架放 public/,Next.js App Router 放 app 目录。WordPress 和 Shopify 则通过一个设置而非一个文件来处理它。
favicon 真的必须在根目录吗?
对那个隐式请求来说,是的。按路径请求 /favicon.ico 的客户端在别处找不到它。只要你的 link 标签指向它们,其他图标可以放在别处。
有了 link 标签,我还需要 favicon.ico 吗?
需要。link 标签服务浏览器,但来自爬虫和旧客户端的按路径请求会绕过你的 HTML,直奔 /favicon.ico。