5 Tips on Creating Redirects in .htaccess

Posted by Y Cheung on Fri, Aug 4, 2023

Per-directory rewrites need rewriting within <Directory> sections or .htaccess files, which introduces some complexity. However, if you only have permission to modify files, you must know how to put redirects in .htaccess files with RewriteRule.

1RewriteEngine on
2RewriteRule ^/index\.html$ /index.php [L]

A RewriteRule consists of three arguments separated by spaces.

The arguments are

  • Pattern: which incoming URLs should be affected by the rule, ex ^/index\.html$;
  • Substitution: where should the matching requests be sent, ex /index.php;
  • [flags]: options affecting the rewritten request, ex [L].

Here are 5 tips for creating redirects in .htaccess files.

1. Browser will cache 301 redirects

Browsers cache 301 redirects permanently unless cache directives in the HTTP response headers clearly state otherwise. The only method to erase these caches is to clear the browser cache, execute a hard reload, or disable caching entirely.

2. Handle special character in RewriteRule

Special characters like &and ? will be translated to their hexcode counterpart. The [NE] flag stops this from occurring.

The above example redirects /anchor/xyz to /bigpage.html#xyz. If the [NE] is not present, the # will be transformed to its hexcode equivalent, %23 , resulting in a 404 Not Found error situation. Please keep in mind that the # symbol may only be used in a substitution, not in a pattern.

1RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]

3. Handle non-alphanumeric characters in RewriteRule

In Apache 2.2, a B flag is introduced to escape non-alphanumeric characters before executing the transformation. And you should use non-alphanumeric characters directly in patterns rather than after url encode, ex using coleen's-story instead of coleen%27s-story .

4. Handle multiple lines RewriteRule in one .htaccess

The most specific should be at the top, and the least specific should be at the bottom. Also, make sure you’re stopping processing with [L] after each redirect rule to prevent Apache from processing subsequent rewrite rules once it finds a match.

5. Handle space in RewriteRule

Using a \ before the space to escape it instead of %20 , ex:

1RewriteRule ^county/phone\ number$ /front-door [R=301,L]

Testing your htaccess rewrite rules

Online testing tools recommends: