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.

  • Is your site accessible from both the www subdomain and the bare domain? You should perhaps be forcing one or the other (as an external redirect) before your internal rewrites I would have thought. Your REQUEST_URI line should probably match !^/sitec rather than !sitec/ since the current pattern matches anywhere in the URI. Are sitea, siteb, etc. the real directories/domains?
    – MrWhite
    Jan 6, 2013 at 11:53
  • I edited my Q with the WordPress .htaccess. If you say I mean "internal rewrite", I'll take your word for it.:) Feel free to edit my Q or tell me what/where to change. All three are accessible with www and no www, but siteA and siteB both remove the www (something I never noticed till now). All 3 point to their respective subdirectories...'http: //siteA.com' points to [my public root]/sitea/, 'http: //siteB.com' points to [my public root]/siteb/, etc.
    – akTed
    Jan 6, 2013 at 12:17
  • If "siteA and siteB both remove the www" then there must be a redirection in the WP code itself, as nothing you've posted above will do this redirection (however, this would normally be done in .htaccess). The problem, however, is that the code you have posted looks OK-ish - it should work. There is certainly nothing here that could be triggering the redirection you are seeing. So, it would seem there is "something else" going on IMO?! Check the HTTP requests using Chrome's debugger tools or "Live HTTP Headers" extension (Firefox) to see if/what redirections are occurring.
    – MrWhite
    Jan 6, 2013 at 20:37
  • @w3d I tried adding the ^ like you'd mentioned in your first comment, but it throws a 500 Internal Server Error.
    – akTed
    Jan 7, 2013 at 3:08
  • 1
    @AKTed I've got your question migrated back here as this is the best place for it. I've also removed comments which give information which you've now put back into the question, so it's easer to follow the remaining comments. I hope we can get a solution! Jan 7, 2013 at 15:08

1 Answer 1


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.


RewriteEngine On

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]


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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.