How to Fix "Page Not Found" error on Netlify while using React Router


Deploying single-page applications (SPAs) in React has never been easier with Netlify.

SPAs are great since they perform all the page routing on the client side, or in the browser. There are no page reloads or extra wait time, making them feel smoother and more natural.

Netlify, acting as our server, expects to be handling routes, but doesn’t know how to handle React Router routes since we never explicitly told Netlify that we’re using React Router.

Example React App

Suppose we had this React code in our App.js file:

import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

const Home = () => <h1>Home!</h1>;
const About = () => <h1>About!</h1>;
const App = () => (
  <Router>
    <div>
      <nav>
        <ul>
          <li><Link legacyBehavior to="/">Home</Link></li>
          <li><Link legacyBehavior to="/about">About</Link></li>
        </ul>
      </nav>
      <Route path="/" exact component={Home} />
      <Route path="/about" component={About} />
    </div>
  </Router>
);

ReactDOM.render(<App />, document.querySelector("#root"));

The Routing Problem

We have two pages on our site: / and /about.

When we deploy this on Netlify, we’ll be able to access somedomain.netlify.app, which accesses the / route.

From there, we can also navigate using the <nav> element to somedomain.netlify.app/about.

Unfortunately, when we directly enter somedomain.netlify.app/about into our browser’s URL bar, we’ll get the infamous Page Not Found error.

Page Not Found
Looks like you've followed a broken link or entered
a URL that doesn't exist on this site.

The Solution

Netlify supports a _redirects file, which we can add to our root folder to tell Netlify how to handle page routing.

In our case, we can create a file called _redirects in our /public folder with this single line of code:

/*    /index.html   200

That’s it! We’re essentially rerouting everything back to our index.html, where the actual routing will be taking place on the client side.

Be sure to check out Netlify’s documentation on single-page applications as well as their article on redirects.