How to Effectively Use mod_rewrite to Load Files Behind the DocumentRoot in Apache

When working with Apache web servers, you may encounter situations where you need to serve files that reside outside of the DocumentRoot directory. This can be particularly tricky and might lead to frustrating errors, such as “The requested URL was not found on this server.” In this blog post, we’ll explore how to correctly set up the .htaccess file and mod_rewrite to load files behind the DocumentRoot.

Understanding the Problem

Consider the following folder structure:

home/
    webroot/
    other_files/

Imagine you have a .htaccess file in the webroot directory filled with this code:

RewriteEngine on
RewriteRule ^(.*)$ /home/other_files/$1

If you attempt to access http://example.com/file.html, you might see an error like:

The requested URL /home/other_files/file.html was not found on this server.

This indicates that Apache does not know how to serve files located in the other_files folder, as it lies outside the defined DocumentRoot.

The Solution

To properly load files behind the DocumentRoot using .htaccess and mod_rewrite, you’ll need to make some server configuration changes. Let’s break this down into clear steps.

Step 1: Configure the Apache Server

To allow Apache to serve files from the other_files directory, you will need to add a configuration block in the server settings. This is typically done in the Apache configuration files (not in the .htaccess file). Here’s how:

<Directory "/home/other_files">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

Explanation of the Configuration:

  • Options: Controls the options for the directory (like enabling indexing).
  • AllowOverride: Defines what directives can be overridden by .htaccess.
  • Order: This specifies the access control order (deny first, then allow).
  • Deny/Allow: Sets which IP addresses are allowed to access the directory.

Step 2: Use the Alias Directive (Optional)

If you don’t want to configure Apache directly to expose the other_files directory, you can create an alias that maps a URL to the file’s actual location. Here’s how it could look:

Alias /doc/ "/home/other_files/"
<Directory "/home/other_files/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

By using an Alias, you can now rewrite a URL like /doc/file.html to fetch files from the other_files directory.

Step 3: Restart Apache

Once you’ve made these changes to your Apache configuration, be sure to restart the server for the new settings to take effect:

sudo service apache2 restart

Conclusion

Serving files from directories outside the DocumentRoot in Apache is certainly possible and can be accomplished with the right configuration. By setting up directives properly in the Apache server configuration or using aliases, you can ensure that your .htaccess rewrites work effectively.

If you continue to face issues, double-check your configurations, and don’t hesitate to consult the official Apache Documentation for further details.

By following these steps, you’ll be able to utilize the power of mod_rewrite while successfully managing file locations within your Apache server setup!