Jens Oliver Meiert

.htaccess: 7 Useful Ingredients (Plus Bonus)

Post from April 12, 2007 (↻ June 12, 2021), filed under .

This and many other posts are also available as a pretty, well-behaved ebook: On Web Development.

This article features useful directives for .htaccess configuration files, based on my experience with a number of lightweight projects. It’s a pretty simple collection and you may be aware of some of these things. However, the simplicity can come in handy when your provider is somewhat restrictive (as DreamHost, for example, dislikes CheckSpelling).

  1. AddDefaultCharset On|Off|charset

    The AddDefaultCharset directive adds a default encoding parameter when the content type of a response is text/plain or text/html. (As far as I know the name of the directive is misleading—it specifies an encoding, not a character set.) When set, the affected files use the specified encoding. This directive also takes precedence over other encoding definitions.

    Example that makes utf-8 the default encoding: AddDefaultCharset utf-8.

  2. CheckSpelling On|Off

    CheckSpelling is a nice way towards a better website experience. It can also unburden error logs since it auto-corrects file requests. When activated, the directive compares each document name in the respective directory against the requested document name without regard to case, and compensates for one misspelling (character insertion, omission, transposition, or otherwise wrong character).

    Example of CheckSpelling being enabled: CheckSpelling On.

  3. ContentDigest On|Off

    The ContentDigest directive enables Content-MD5 headers as specified in RFC 1864 and RFC 2068, respectively, and thus helps you with caching. ContentDigest can impact server performance, though; also, there are alternatives.

    Example use: ContentDigest On.

  4. 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 by AddLanguage) should be considered to be in the specified MIME-lang language.”

    Example that sets German as the default language: DefaultLanguage de.

  5. ErrorDocument error-code document

    The ErrorDocument directive is one of the most relevant directives to set due to the importance of error pages (as errors are bad for the user experience, those documents should be on point). The directive allows you to define documents for certain HTTP status codes.

    Example pointing to an “error404” document in case a “not found” error shows up: ErrorDocument 404 /error404.

  6. Redirect [status] URL-path URL
    RedirectMatch [status] regex URL

    Redirect and RedirectMatch are other important and popular directives, allowing to redirect requests to alternative locations, be they temporary or permanent, as defined by the respective HTTP status code. While Redirect is pretty simple and probably more popular that RedirectMatch, the latter means more options for more powerful redirects. However, due to both popularity and complexity (of RedirectMatch’s regex capabilities), I recommend to take a closer look at the Apache documentation, and to do some tests first.

    Examples permantly redirecting /count to a canonical Mint tracker as well as GIF images to PNG:

    Redirect 301 /count https://example.com/mint/?js
    RedirectMatch 301 /img/(.*)gif https://example.com/img/$1png
  7. 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 the “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 second 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 enforced as shown.

Bonus

I like to put some useful .htaccess articles and tutorials on top. In alphabetical order:

Tweet this? (If it changed your life, you delight me with a coffee.)

About Me

Jens Oliver Meiert, on April 29, 2020.

I’m Jens Oliver Meiert, and I’m an engineering manager and author. I’ve worked as a technical lead for Google, I’m close to the W3C and the WHATWG, and I write and review books for O’Reilly. Other than that, I love trying things, sometimes including philosophy, art, and adventure. Here on meiert.com I share some of my views and experiences.

If you have questions or suggestions about what I write, please leave a comment (if available) or a message.

Comments (Closed)

  1. 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

  2. On May 9, 2007, 19:53 CEST, Jens Oliver Meiert said:

    Robert, what do you mean by “not having any luck”?

    I made sure I use AddDefaultCharset on WHWS (DreamHost-hosted). That works fine.

  3. 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/html

    200 OK

    The content-type is text/html not text/html; charset=utf-8

    :-) I enjoyed the WHWS!

    Robert

  4. 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’re referrring to is based on a HEAD request. A GET shows that the encoding is set to UTF-8, though via meta element.

    AddDefaultCharset’s definitely applied when there is no encoding information available (see example text file via HEAD request). While you could check what happens when you don’t set the encoding via meta (not always advisable), I’ll take a look at the specs again.

  5. 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:

Looking for a way to comment? Comments have been disabled, unfortunately.

Cover: The Web Development Glossary.

Perhaps my most comprehensive book: The Web Development Glossary (2020). With explanations and definitions for literally thousands of terms from Web Development and related fields, building on Wikipedia as well as the MDN Web Docs. Available at Apple Books, Kobo, Google Play Books, and Leanpub.

Stay up-to-date? Follow me by feed or on Twitter.

Found a mistake? Email me, jens@meiert.com.

You are here: HomeArchive2007 → .htaccess: 7 Useful Ingredients (Plus Bonus)

Last update: June 12, 2021

Professional frontend developers produce valid HTML and CSS.