Apache Redirect HTML Files to a Directory

242 words ยท 2 minutes

The Problem

After recently switching static site generators (SSG), my blog URLs changed with no option to preserve the classic .html extension at the end of my blog post URLs.

I really disliked using my old SSG (Jekyll) and prefer my new tool (Zola) much more, so I was determined to figure out a way to get the proper redirect set up so that people who find my posts online aren't constantly met by 404 errors.

The Solution

To solve this problem, I really needed to solve two pieces:

  1. Redirect all blog post URL requests from /blog/some-post.html to /blog/some-post/.
  2. Ensure that no other .html files are redirected, such as index.html.

After a lot of tweaking and testing, I believe I have finally found the solution. The solution is shown below.

RewriteEngine On
RewriteCond %{REQUEST_URI} !\index.html$ [NC]
RewriteRule ^(.*).html$ https://example.com/$1 [R=301,L]

This piece of code in the Apache .conf or .htaccess file will do the following:

  1. Turn on the RewriteEngine so that we can modify URLs.
  2. Ignore any index.html files from the rule we are about to specify.
  3. Find any .html files within the website directory and redirect it to exclude the file extension.
  4. The final piece is adding the trailing slash (/) at the end of the URL - you'll notice that I don't have an Apache rule for that since Apache handles that automatically.