---
title: 404 handling
---

When Rakkas fails to match a URL with a page component, it will look for a `$404.page.jsx` (or `.tsx`) file. For instance, when a request to `/foo/bar/baz` is made and no page component matches, Rakkas will look for `/foo/bar/baz/$404`, `/foo/bar/$404`, `/foo/$404`, and `/$404` in that order. This way, 404 pages can have the correct layout depending on the URL.

404 pages can have `action`, `headers`, `prerender`, and `preload` functions just like normal pages. It's good practice to always have a root 404 page in `src/routes/$404.page.jsx` or `.tsx`, Rakkas's default 404 page is very basic unstyled.

The difference between using a 404 page and a catch-all page with spread parameters, that is betweebn `/path/$404` and `/path/[...rest]` is that 404 pages have lower priority. A catch-all page route will match before any API routes, but a 404 page will only match if no other route matches.

If a `Link` or `StyledLink` component points to a non-existent page, Rakkas will do a full page reload before showing a 404 page just in case the URL is pointing to a non-page route like an API endpoint or a static file.
