Using mod_rewrite to Mimic SSL Virtual Hosts in Apache 2.2

Setting up secure websites is crucial in today’s digital landscape, especially when handling sensitive information. One challenge that many web administrators face is how to create multiple name-based virtual hosts over SSL using Apache 2.2, an operation that isn’t natively supported. In this post, we will discuss how to use Apache’s mod_rewrite module to write rules that let users access one domain while being seamlessly served from another. Specifically, we’ll reconfigure URLs so that when users visit https://dbadmin.example.com, they are transparently taken to https://secure.example.com/dbadmin without the URL changing in their browsers.

Understanding the Problem

Apache 2.2 does not support multiple name-based virtual hosts for SSL connections. This means that accessing different secure domains could lead to confusion or even errors. For example, you want users visiting https://dbadmin.example.com to end up at https://secure.example.com/dbadmin but still see https://dbadmin.example.com in their browser. This approach enhances user experience while ensuring secure communications.

The Solution

To resolve this issue, we will use a combination of virtual host configuration and mod_rewrite rules. Below is a simple step-by-step guide:

Step 1: Configure the Virtual Host

  1. Create a Single VirtualHost for SSL: This configuration will support both secure.example.com and dbadmin.example.com. The configuration should look like this:

    <VirtualHost *:443>
        ServerName secure.example.com
        ServerAlias dbadmin.example.com
    
        RewriteEngine on
        RewriteCond %{SERVER_NAME} dbadmin.example.com
        RewriteRule !/dbadmin(.*)$ /dbadmin$1
    </VirtualHost>
    
    • Explanation:
      • ServerName specifies the primary domain.
      • ServerAlias allows the server to respond to requests for additional domains (in this case, dbadmin.example.com).
      • RewriteEngine on activates the mod_rewrite module.
      • RewriteCond checks if the incoming request is directed to dbadmin.example.com.
      • RewriteRule rewrites the request without changing the URL displayed in the client’s browser.

Step 2: SSL Certificate Requirements

Make sure your SSL certificate is valid for both domains. You can do this in two ways:

  • Wildcard Certificate: This will cover all subdomains under a specific domain.
  • Subject Alt Name (SAN): Add multiple domain names to the SSL certificate, ensuring that both secure.example.com and dbadmin.example.com are recognized.

Step 3: Testing Your Configuration

Before implementing SSL, it’s a good idea to check if the rewrite works without it. Temporarily set the directive to <VirtualHost *> and confirm that requests to http://dbadmin.example.com are correctly rewritten to http://secure.example.com/dbadmin. Once confirmed, revert to <VirtualHost *:443> for SSL configurations.

Troubleshooting Tips

  • If you encounter issues or rewrites don’t seem to work initially, double-check the syntax and ensure mod_rewrite is enabled in your Apache configuration.
  • Check logs for any rewrite errors or SSL issues that might provide insight into any problems.

Conclusion

By effectively utilizing mod_rewrite in conjunction with properly configured SSL virtual hosts, you can achieve seamless redirection that enhances both security and user experience. This method allows you to serve multiple domains over HTTPS without exposing the internal structure to the end user, preserving their browsing experience.

Implementing these strategies will strengthen your website’s security while maintaining an efficient structure, ensuring that your users get the correct resources without unnecessary confusion or additional clicks.