Where Does favicon.ico Go? The Root-Path Convention
By long-standing convention, browsers and many crawlers request /favicon.ico from the root of your domain even with no link tag pointing at it. So a favicon.ico served at the site root is the one file that satisfies everything asking by path. Where you physically place it varies by stack (public/ for most frameworks, the app directory for Next.js), but it must end up answering at /favicon.ico.
The root request nobody declares
Even if your head has no icon link at all, browsers, feed readers, and crawlers will still ask for /favicon.ico at the very root of the domain. It's an implicit request that predates the link tag, and plenty of clients rely on it.
That's why the file has to resolve at the root path. Your link tags cover everything else (SVG, PNG sizes, apple-touch-icon), but this one URL is requested whether you point at it or not.
Where the file goes by stack
| Stack | Put the file in |
|---|---|
| Plain HTML | The site root, served at /favicon.ico |
| Vite / React / Vue | public/, copied to the root |
| Next.js App Router | the app directory (app/favicon.ico) |
| WordPress | the Site Icon setting, not a file you upload |
| Angular | public/, or listed in angular.json assets |
Favicon path FAQ
Where do I put favicon.ico?
Somewhere that serves it at /favicon.ico: the site root for plain HTML, public/ for most frameworks, the app directory for Next.js App Router. WordPress and Shopify handle it through a setting instead of a file.
Does the favicon really have to be at the root?
For the implicit request, yes. Clients that ask for /favicon.ico by path won't find it anywhere else. Additional icons can live elsewhere as long as your link tags point at them.
Do I still need favicon.ico if I have link tags?
Yes. Link tags serve browsers, but path-based requests from crawlers and older clients bypass your HTML and go straight to /favicon.ico.