aboutsummaryrefslogtreecommitdiff
path: root/content/blog/2021-10-09-apache-redirect.org
blob: beb37dded1d9ac38707aba9877ee3a3c9c76dc05 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#+date:        <2021-10-09 Sat 00:00:00>
#+title:       Configuration of Apache Rewrite Rules for Redirecting HTML URLs to Directory URLs
#+description: Technical guide to applying Apache mod_rewrite directives for transforming .html file requests into clean directory-style URL structures to enhance website navigation and indexing.
#+slug:        apache-redirect
#+filetags:    :apache:redirect:urlrewrite:

* 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 ([[https://jekyllrb.com][Jekyll]])
and prefer my new tool ([[https://www.getzola.org][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.

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

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.