Apache – Rewrite all URIs to a single file

This week I had to help a friend with his new small ReacJS website running on Apache.

His problem was that URIs which does not exist the Apache was returning as 404 pages, he needed a common rule used by a lot of PHP frameworks, Rewrite all URIs which are not Files or Directories to /index.html

Example URL www.example.com/myprofile to actually load www.example.com/index.html and let the ReactJS route do his work and show what it needs.

In that case, you might write something like this:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]

What is this doing, it will check the URI either exists as a file or is a directory, if it is NOT, it will call index.html. The [L] means that this will be the LAST match and will stop there, will not continue if we have other rules below that.

This is code is ok, not so simple and you can mess up the conditions, for example, I have seen a lot of [OR] next to RewriteCond %{REQUEST_FILENAME} !-f [OR] which will not work in our case above.

If you need this simple Rewrite rule, you might use Apache command available after 2.2.16 version

FallbackResource /index.html

This will do the same as the above 4 lines if the URI is not found on the server, ie. not a File or a Dir, it will load to /index.html

This command is not part of modrewrite, but of moddir, if you don’t have it enabled, run sudo a2enmod dir and restart the Apache.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.