How can I use .htaccess to rewrite different domains to different sub-directories, masking the sub-directory?

How can I use .htaccess to rewrite different domains to different sub-directories, masking the sub-directory? - .htaccess files are extremely useful in many cases for users who either do not have root permissions or for users who simply aren't comfortable in making changes in their web server's configuration file. Trying to debug .htaccess not working isn't always the easiest thing to do, however, hopefully by checking the discuss below mentioned about htaccess, redirects, directory, url-rewriting, .htaccess common problems as well as the troubleshooting tips, you'll have a better grasp on what you may have to modify to get your .htaccess file running smoothly.Problem :


I have a shared hosting plan that allows unlimited addon domains, but they can only point to the public root (/). I use .htaccess to point different domains to their corresponding sub-directories. For example,



site1.com points to sub-directory /site1/

site2.com points to sub-directory /site2/



I don't want the user to see site1/ or site2/. My .htaccess below almost works. If the user goes to a subdirectory like site2.com/test/ (notice the trailing slash /), it works great. But if the user leaves out the trailing slash it shows site2.com/site2/test/ in the browser.



So my question boils down to, how can I mask the sub-directory whether or not the user types the trailing slash?



My root .htaccess looks like this (only with more domains, all in the same 3-lines per domain format)



RewriteEngine On

RewriteCond %HTTP_HOST ^(www.)?site1.com$ [NC]
RewriteCond %REQUEST_URI !site1/ [NC]
RewriteRule ^(.*)$ /site1/$1 [L]

RewriteCond %HTTP_HOST ^(www.)?site2.com$ [NC]
RewriteCond %REQUEST_URI !site2/ [NC]
RewriteRule ^(.*)$ /site2/$1 [L]


I've tried many things, from different online sources, but nothing works. One thing that almost worked (notice the trailing slash after $1):



RewriteRule ^(.*)$ /site2/$1/ [L]


This works correctly when the filename is omitted - site2.com/test/ - but if you go to site2.com/test/index.php it says "No input file specified."



The only file in root is .htaccess, everything else is in sub-directories.



Edit: Rewrote question, omitting irrelevant details.


Solution :

I finally found a solution. The second RewriteCond in my above code was unnecessary, and the first RewriteRule below, found at B&T's Tips & Scripts, adds a trailing slash if none exists (unless it's a file, like index.php). Here's my new .htaccess. Notice the trailing slash directive only needs to be applied once.



.htaccess



RewriteEngine On

#ADD TRAILING SLASH TO DIRECTORY IF NONE EXISTS
RewriteRule ^([^.]+[^/])$ http://%HTTP_HOST/$1/ [L]

RewriteCond %HTTP_HOST ^(www.)?site1.com$ [NC]
RewriteCond %REQUEST_URI !site1/ [NC]
RewriteRule ^(.*)$ /site1/$1 [L]

RewriteCond %HTTP_HOST ^(www.)?site2.com$ [NC]
RewriteCond %REQUEST_URI !site/ [NC]
RewriteRule ^(.*)$ /site2/$1 [L]


Edit



I'd orignally removed the second RewriteCond from each triplet above, and it worked for my main site + a couple of others. I didn't fully test, and later found a couple other domains I used infrequently weren't working (giving 500 internal errors). I added the second RewriteRule back in and they work again.



What's weird is, after I ended up deleting one of my working testing domain sub-directories and recreating it, the rewrites (without the second RewriteCond) stopped working (throwing the 500 errors). Adding the second RewriteCond made it work again.



Oh, well, I guess I'll chalk it up to the magic of mod_rewrite...as long as it's working.


Additionally, if you would like to do some further testing, give the htaccess tester tool a try. It allows you to specify a certain URL as well as the rules you would like to include and then shows which rules were tested, which ones met the criteria, and which ones were executed.

Comments

Popular posts from this blog

Rewrite in Mediawiki, remove index.php, .htaccess

.htaccess rewrite wildcard folder paths from host

Using .htaccess to set a cookie and 301 redirect