Astro favicon 不显示?这样修复
Astro 会把 public/ 原封不动地复制到输出,但从不替你注入图标标签。标签页空白意味着 link 不在你页面所用的 layout 里,或者某个页面渲染了自己的 html 元素、跳过了 layout。
public/ 保留名字,但没人替你链接
public/ 里的文件会原样复制到输出根目录,所以 /favicon.svg 或 /favicon.ico 是一个真实的 URL。但 Astro 不会扫描 public/ 并注入标签。你想放进 head 的任何东西,都必须写进你页面各自包裹的某个 layout 组件里。
陷阱在于那些跳过 layout 的页面。一个自定义 404 或一次性的落地页,如果写了自己的 html 元素,就没有图标标签,除非你在那里也加上。
找到缺口
- 1
直接打开 /favicon.ico(或 /favicon.svg)
出现 404 说明文件不在 public/ 里。如果能加载,说明文件没问题,缺失的 link 标签才是问题。
- 2
检查 layout 是否渲染了那个 link
在一个正常页面上查看源代码。没有 rel=icon 标签,说明你的 Layout.astro 没有包含它。把 link 标签加进 layout 的 head。
- 3
检查那些跳过 layout 的页面
自定义 404 和写了自己 html 的独立页面不会继承 layout 的 head。在那里也加上图标标签,或者用 layout 把它们包起来。
Astro favicon 不显示:常见问题
为什么我的 Astro favicon 不显示?
Astro 不注入任何图标标签,所以要么是你的 layout 没渲染那个 link,要么是相关页面跳过了 layout。先确认文件能在它的 URL 上加载,再检查 layout 的 head 里是否真的有 rel=icon 标签。
我必须给每个页面都加标签吗?
只需给你页面所包裹的 layout 加。陷阱在于那些不包裹的页面:一个自定义 404 或一个写了自己 html 元素的落地页,需要直接加上标签。
我的站点在子路径下,图标 404 了。
在 astro.config.mjs 里设置 base,但 Astro 不会重写你自己标记里硬编码的路径。用 import.meta.env.BASE_URL 给 href 加前缀,并在部署前检查构建后的 HTML。