Astroプロジェクトを新しく立ち上げてVercelやNetlifyにデプロイした後、ブラウザのタブにデフォルトのグラデーションロケットアイコンが堂々と表示されていることに気づいた経験はありませんか?Next.jsや生のHTMLから移行してきた開発者がこの壁にぶつかるのを、私は何度も見てきました。astroフレームワークのfavicon設定は決して難しくありませんが、Astro特有のアセットパイプラインを理解していないと、適当な場所に.icoファイルを置くだけでは機能しません。
Astroの静的アセットの扱いは、従来のバンドラーとは異なります。アイコンを間違ったフォルダに置くと、Viteがそれを無視するか、ファイル名をハッシュ化するか、本番環境で404エラーを吐き出します。今すぐこの問題を解決しましょう。
最大の分岐点:public/ vs src/assets/
Astroにおいて開発者が最もよく犯す間違いは、faviconをsrc/assets/ディレクトリ内に配置してしまうことです。Astroのアセットパイプラインは画像最適化には優れていますが、キャッシュ制御のためにファイル名を強力にハッシュ化します(例:icon.svgがicon.a8b3c9.svgに変わってしまいます)。
ブラウザやRSSリーダー、クローラーは、faviconが予測可能で静的なURL(理想的にはドメインのルート)にあることを期待しています。これを実現するには、faviconファイルをpublic/ディレクトリに配置する必要があります。
Astroはpublic/フォルダ内のすべてを、ファイル名に一切手を加えずにビルド出力(通常はdist/フォルダ)に直接コピーします。これにより、public/favicon.svgが確実にyoursite.com/favicon.svgとして配信されます。
ステップ1:モダンなアイコンセットを準備する
今は2026年です。10年前に消滅したデバイスのために、30種類ものレガシーアイコンサイズを生成するのはやめましょう。完璧な設定に必要なファイルは、たったの3つです。
- favicon.svg:モダンスタンダード。無限に拡大縮小でき、CSSメディアクエリによるダークモードにも対応します。
- favicon.ico:古いブラウザ用の32x32アイコンを含むレガシーフォールバック。
- apple-touch-icon.png:iOSのホーム画面やブックマーク専用の180x180のPNG。
高解像度のロゴPNGしか持っていない場合は、Mzu favicondlを通せば、この完璧な3ファイルセットを瞬時に生成できます。(なぜこの構成が最適なのか深く知りたい方は、faviconのベストプラクティスガイドをご覧ください)。
ステップ2:ファイルをpublicディレクトリに配置する
生成した3つのファイルを、Astroプロジェクトのpublic/フォルダのルートに直接ドロップします。プロジェクトの構造は次のようになります:
├── public/
│ ├── favicon.svg
│ ├── favicon.ico
│ └── apple-touch-icon.png
├── src/
│ ├── components/
│ ├── layouts/
│ └── pages/
└── astro.config.mjspublic/images/フォルダなどにネストしないでください。ルートに保つことが重要です。これにより、HTMLを読み込まずに盲目的に/favicon.icoをリクエストするツールでも、確実に見つけることができます。
ステップ3:BaseHeadコンポーネントを更新する
最近のAstroテンプレートの多くは、<head>セクションに共有コンポーネント(通常はBaseHead.astro、またはLayout.astro内)を使用しています。そのファイルを開いてください。
正しいHTMLのlinkタグを追加する必要があります。href属性の先頭にあるスラッシュに注目してください。これが非常に重要です。
<!-- src/components/BaseHead.astro 内 -->
<meta charset='utf-8' />
<meta name='viewport' content='width=device-width,initial-scale=1' />
<!-- Faviconセット -->
<link rel='icon' href='/favicon.ico' sizes='32x32' />
<link rel='icon' href='/favicon.svg' type='image/svg+xml' />
<link rel='apple-touch-icon' href='/apple-touch-icon.png' />
<!-- オプション:Web App Manifest -->
<link rel='manifest' href='/site.webmanifest' />GitHubがブラウザアイコンをどう処理しているか見てみましょう。彼らはモダンブラウザ向けに鮮明なSVGを提供し、システムテーマに基づいて動的に色を切り替えていますが、ルーティングはルートレベルで極めてシンプルに保っています。Astroのpublic/ディレクトリと絶対パスを使用することで、このGitHubレベルの洗練された実装を簡単に再現できます。
Astroでのよくある落とし穴
先頭のスラッシュ忘れ
href='/favicon.svg'ではなくhref='favicon.svg'と書いてしまうと、ネストされたルートでアイコンが壊れます。例えば、ユーザーがyoursite.com/blog/my-post/にアクセスした場合、ブラウザはyoursite.com/blog/my-post/favicon.svgを探しに行って失敗します。必ずスラッシュから始まる絶対パスを使用してください。それでも解決しない場合は、faviconが表示されない場合のトラブルシューティングガイドを確認してください。
Base Pathの設定問題
Astroサイトをサブディレクトリ(GitHub Pagesなど)にデプロイし、astro.config.mjsでbaseオプションを設定している場合、標準の絶対パスは機能しなくなります。Astroに組み込まれているbaseヘルパーを使用する必要があります。
フロントマターでimport.meta.env.BASE_URLをインポートし、リンクに適用します:
---
const baseUrl = import.meta.env.BASE_URL;
---
<link rel='icon' href=`${baseUrl}favicon.svg` type='image/svg+xml' />これにより、ローカルのlocalhostで実行している場合でも、ネストされた本番URLにデプロイされている場合でも、faviconのパスが動的に調整されます。
ルーティングのルールさえ理解すれば、Astroフレームワークのfavicon設定は2分で終わります。public/フォルダを使用し、絶対パスを指定して、あとはブラウザに任せましょう。