Apache’s mod_rewrite module is a powerful tool for manipulating URLs and redirecting traffic. In this tutorial, we’ll explore how to configure generic redirects using mod_rewrite, allowing you to easily redirect traffic from one domain to another without hardcoding the domain name.
Introduction to mod_rewrite
Before diving into the configuration, let’s briefly introduce the basics of mod_rewrite. The module uses a set of rules and conditions to manipulate URLs. These rules are defined in Apache’s configuration files, such as .htaccess or httpd.conf.
A typical mod_rewrite rule consists of:
RewriteCond
: A condition that must be met for the rule to apply.RewriteRule
: The actual rule that performs the URL manipulation.
Generic Redirects
To create a generic redirect from www to non-www, we need to capture the domain name without the "www" prefix. We can achieve this using a regular expression in the RewriteCond
directive.
Here’s an example of a generic redirect rule:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Let’s break down this rule:
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
: This condition checks if the HTTP host (i.e., the domain name) starts with "www." and captures the remaining part of the domain using the(.*)
pattern. The[NC]
flag makes the match case-insensitive.RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
: This rule redirects the URL to the captured domain name without the "www" prefix, preserving the original path and query string. The%1
refers to the first captured group (i.e., the domain name), and$1
refers to the original path.
Handling HTTP and HTTPS Separately
If you need to handle HTTP and HTTPS separately, you can add additional conditions to check the protocol:
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
These rules check the HTTPS status using the %{HTTPS}
variable and apply the redirect accordingly.
Alternative Approaches
Alternatively, you can use Apache’s Redirect
directive in the httpd.conf file to achieve a similar result without mod_rewrite:
<VirtualHost *>
ServerName www.example.com
Redirect 301 / http://example.com/
</VirtualHost>
This approach is specific to the domain name and doesn’t offer the same level of flexibility as mod_rewrite.
Best Practices
When working with redirects, keep in mind:
- Always use the
[R=301]
flag to specify a permanent redirect. - Use the
[L]
flag to indicate that this rule should be the last one applied. - Consider using the
[NE]
flag to prevent Apache from escaping the query string.
By following these guidelines and examples, you’ll be able to configure generic redirects with Apache’s mod_rewrite module, making it easier to manage your website’s URL structure and improve user experience.