Question

I'm using .htaccess and mod_rewrite to point to files that reside behind the DocumentRoot. My folder structure looks like this:

home/
    webroot/
    other_files/

I have a .htaccess file in webroot with the following content:

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

If I try to access http://example.com/file.html I receive the following error:

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

Is it even possible to load files that are behind the DocumentRoot? If so, can someone point me in the right direction?

Was it helpful?

Solution

I believe you need to add a section with

<Directory "/home/other_files">
  (options)
</Directory>

to your server configuration before apache will be able to serve anything from it. For an example, my DocumentRoot is /var/www but there is this section in the default available site:

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    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>

You could then rewrite a URL to go to /doc/ and the server would know where to get the files from.

OTHER TIPS

Just so you know why that rule doesn't work:

The reason that it isn't able to rewrite to /home/other\_files/file.html is that mod_rewrite is parsing the path as /home/webroot/home/other\_files/file.html since from mod_rewrite's point of view the preceding slash is equivelant to your document root of /home/webroot.

Ryan Ahearn's suggestion is a decent one, and is likely the route you want to go.

The credit goes to Ryan Aheam, but I'm going to spell it out. I'm a beginner and even with Ryan's answer I had to experiment with a few things to get the syntax right.

I wanted my DocumentRoot to be my cakephp directory. But then I had a Mantis Bug tracker that was just regular php and so not in the cakephp directory. The the files below I have the following working.

http://www.my_website.com : served by /var/www/cakephp

http://www.my_website.com/mantisbt : served by /var/www/html/mantisbt

File /etc/httpd/conf/httpd.conf

Alias /mantisbt/ "/var/www/html/mantisbt/"                                                                          
<Directory "/var/www/html/">                                                                                        
    AllowOverride All                                                                                               
</Directory>                                                                                                        

<VirtualHost *:80>                                                                                                  
    ServerAdmin me@my_email.com                                                                             
    DocumentRoot /var/www/cakephp                                                                                   
    ServerName my_website.com                                                                                      
    <Directory /var/www/cakephp/>                                                                                   
        AllowOverride All                                                                                           
    </Directory>                                                                                                    
</VirtualHost>

File /var/www/cakephp/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^mantisbt/?$   /mantisbt/  [NC,L]
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
</IfModule>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top