.htaccess: 7 Useful Ingredients (Plus Bonus)
Post from April 12, 2007 (↻ June 2, 2020), filed under Web Development.
This and many other posts are also available as a pretty, well-behaved ebook: On Web Development.
Right on, here’ some helpful constituents of any decent .htaccess configuration file, based on my experience with quite a few lightweight projects. It’s a pretty simple collection and you’re surely aware of some of these things. However, this simpleness might come in handy once your provider is somewhat restrictive (as DreamHost, for example, even dislikes CheckSpelling
).
-
AddDefaultCharset On|Off|charset
The
AddDefaultCharset
directive adds a default encoding parameter when the content type of a response istext/plain
ortext/html
. (As far as I know the name of the directive is misleading—it specifies an encoding, not a character set.) It must be noted that when set, all affected files need to use the specified encoding. This directive also takes precedence over other encoding definitions.Example that makes
utf-8
the default encoding:AddDefaultCharset utf-8
. -
CheckSpelling On|Off
CheckSpelling
is a nice way towards a more “tolerant” website experience and to unburden error logs since it can be used to auto-correct file requests. When activated, this “spell checker” compares each document name in the requested directory against the requested document name without regard to case, and it allows up to one misspelling (character insertion, omission, transposition, or a wrong character).Example for
CheckSpelling
being enabled:CheckSpelling On
. -
ContentDigest On|Off
The
ContentDigest
directive enablesContent-MD5
headers as specified in RFC 1864 and RFC 2068, respectively, and thus makes you benefit from caching. Please note thatContentDigest
may influence server performance, though; also, there are alternatives.Example use:
ContentDigest On
. -
DefaultLanguage MIME-lang
DefaultLanguage
“tells Apache that all files in the directive’s scope (e.g., all files covered by the current<Directory>
container) that don’t have an explicit language extension (such as.fr
or.de
as configured byAddLanguage
) should be considered to be in the specified MIME-lang language”.Example that sets German as the default language:
DefaultLanguage de
. -
ErrorDocument error-code document
The
ErrorDocument
directive’s certainly one of the most considerable directives to set due to the importance of error pages (errors occur but are no fun, so those documents should be to the point and helpful). The directive allows you to define specific documents for certain HTTP status codes.Example pointing to a “error404” document in case a beloved “not found” error shows up:
ErrorDocument 404 /error404
. -
Redirect [status] URL-path URL RedirectMatch [status] regex URL
Redirect
andRedirectMatch
are other very important and quite popular directives, allowing, right, to redirect requests to alternative locations, be they temporary or permanent or whatever, as defined by the respective HTTP status code. WhileRedirect
is pretty simple and surely way more popular thatRedirectMatch
, the latter means more possibilities for more elegant redirects. However, due to both popularity and complexity (of at leastRedirectMatch
’s regex stuff), I may just commend to take a closer look at the Apache documentation, and to do some tests.Examples permantly redirecting
/count
to a canonical Mint tracker as well as former GIF images to PNG:Redirect 301 /count https://example.com/mint/?js RedirectMatch 301 /img/(.*)gif https://example.com/img/$1png
-
RewriteEngine on RewriteCond %{HTTP_HOST} ^www.example.com [NC] RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
This is not a short description of a single directive you could use in your .htaccess file, but rather a snippet that’s for immediate use when it comes to that “canonical domain name with or without www” question. The above snippet rewrites URLs starting with “www.example.com” to “example.com”, and it’s easily changed so that it does so vice-versa. Although some claim that “www. is deprecated” (I tend to support that) and search engines like Google already allow you to specify the preferred domain spelling, that’s still a “matter of taste” that can be wired as shown anyway.
Bonus References
Some additional useful .htaccess related articles and tutorials on top. In alphabetical order.
- Apache HTTP Server Project: Apache Tutorial: .htaccess Files;
- AskApache: Apache htaccess Ultimate Guide;
- Bently: More .htaccess Tips and Tricks;
- Esteves: .htaccess Cheatsheet;
- JavaScript Kit: Comprehensive Guide to .htaccess.
About Me

I’m Jens Oliver Meiert, and I’m a web developer and author. I love trying things (including philosophy, art, and adventure). Here on meiert.com I share some of my views and experiences.
If you have a question or suggestion about what I write, please leave a comment (if available) or a message.
Comments (Closed)
-
On May 9, 2007, 17:10 CEST, Robert said:
Hi Jens,
I am not having any luck using:
AddDefaultCharset utf-8
on a Dreamhost server…
Am I missing a special step for the Dreamhost world.
Thanks
-
On May 9, 2007, 19:53 CEST, Jens Oliver Meiert said:
Robert, what do you mean by “not having any luck”?
I just made sure I use
AddDefaultCharset
on WHWS (DreamHost hosted), and that works fine. -
On May 9, 2007, 22:19 CEST, Robert said:
Hi Jens,
On this page I have a meta tag for charset along with a one line .htaccess file:
AddDefaultCharset utf-8
When I check the response headers using the Firefox Web Developer Extension:
Date: Wed, 09 May 2007 21:11:15 GMT
Server: Apache/1.3.37 (Unix) mod_throttle/3.1.2 DAV/1.0.3 mod_fastcgi/2.4.2 mod_gzip/1.3.26.1a PHP/4.4.4 mod_ssl/2.8.22 OpenSSL/0.9.7e
X-Powered-By: PHP/5.2.1
MS-Author-Via: DAV
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html200 OK
The content-type is text/html not text/html; charset=utf-8
:-) I enjoyed the WHWS!
Robert
-
On May 10, 2007, 9:54 CEST, Jens Oliver Meiert said:
I probably have to look up some things again, but as far as I see, the reply you show here is based on a HEAD request. A GET will reveal that the encoding is set to
UTF-8
, though viameta
element.AddDefaultCharset
’s definitely applied when there is no encoding information available (see example text file via HEAD request). While you might want to check what happens when you don’t set the encoding viameta
(not always advisable though), I might take a look at the specs again. -
On December 12, 2008, 15:37 CET, MrBruks said:
thanks for links Meiert, I’ve just solved my problem with .htaccess
Read More
Have a look at the most popular posts, possibly including:
- The Problem with Link Blogs (Plus Five Link Blogs That Rock)
- Revitalizing SUS, the System Usability Scale

Perhaps my most relevant book: CSS Optimization Basics (2018). Writing CSS is a craft. As craftspeople we strive to write high quality CSS. In CSS Optimization Basics I lay out some of the most important aspects of such CSS. (Also available in a bundle with Upgrade Your HTML and The Web Development Glossary.)
Looking for a way to comment? Comments have been disabled, unfortunately.