Given the power and flexibility of mod_rewrite it's not surprising that people often use it as their golden hammer. Part of gaining knowledge about mod_rewrite is knowing when not to use it.

The following is a list of misuses of mod_rewrite and more appropriate (and often faster) alternatives. These examples assume the RewriteRules are not placed in a directory context (i.e., not in a .htaccess file nor in a <Directory> section).

Simple Redirects

RewriteRule ^/(.*) http://other.example.com/$1

# is better expressed as..
Redirect / http://other.example.com/

Complex Redirects

# redirect and drop the trailing uri
RewriteRule ^/.* http://other.example.com/

# is better expressed as.. (we only need to match every possible string 
# without storing it, thus just ^)
RedirectMatch ^ http://other.example.com/
# redirect to a uri containing a portion of the original
RewriteRule ^/foo/(.+)/bar http://other.example.com/$1

# is better expressed as..
RedirectMatch ^/foo/(.+)/bar http://other.example.com/$1

Appropriate uses of mod_rewrite for redirecting include:

  • Redirecting based on the query string
  • Redirecting based on other request details such as user-agent.

Aliasing

RewriteRule ^/foo/(.*) /bar/$1

# is better expressed as..
Alias /foo /var/www/bar

or

RewriteRule ^/foo/(.*)/baz /bar/$1

# is better expressed as..
AliasMatch /foo/(.*)/baz /var/www/bar/$1

Appropriate uses of mod_rewrite for aliasing include:

  • Aliasing based on complex rules

TODO, validate AliasMatch example, add more valid uses or expand them (smile)

Proxying

RewriteRule ^/(.*) http://other.example.com/$1 [P]

# is better expressed as..
ProxyPass / http://other.example.com/
# reverse proxy everything except images
RewriteCond %{REQUEST_URI} !^/images
RewriteRule ^/(.*) http://other.example.com/$1 [P]

# is better expressed as..
ProxyPass /images !
ProxyPass / http://other.example.com/