Redirect wildcard subdomains to subdirectory, without changing URL in address bar

14,909

Solution 1

First of all, make sure that the vhost in the apache configuration is properly configured and all subdomains of domain.com are in the same host configuration (wildcard):

<VirtualHost *:80>
ServerName domain.com
ServerAlias *.domain.com
...

You can get the redirect working with the following htaccess configuration:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ http://domain.com/%1/$1 [L,NC,QSA]

Now, if you open asd.domain.com it should redirect you to domain.com/asd. You will still have the problem, that the redirect is visible in the URL address bar. In order to prevent this, enable mod_proxy (and load the submodules) on your server and exchange the "L" flag with the "P" flag:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ http://domain.com/%1/$1 [P,NC,QSA]

If this doesn't work, viewing the vhost configuration and the content of error.log on subdomain calling will be helpful!

References:
.htaccess rewrite subdomain to directory
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_p

Solution 2

This can be achieved in .htaccess without mod_proxy provided your server is configured to allow wildcard subdomains. (I achieved that in JustHost by creating a subomain manually named *). Add this to your .htaccess file:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]
Share:
14,909
Newnab
Author by

Newnab

Updated on June 04, 2022

Comments

  • Newnab
    Newnab almost 2 years

    I've read a lot of questions and answers about this on here but none that seem to solve my specific problem.

    I want to redirect any subdomain to the subdirectory to match.

    So: x.domain.com would go to domain.com/x, and y.domain.com would go to domain.com/y - But I want to do this without the URL in the address bar changing.

    Here's what I have so far:

        Options +FollowSymLinks 
    
        RewriteEngine on
    
        RewriteBase /
    
        RewriteCond %{HTTP_HOST} !^(www)\. [NC]
    
        RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com [NC]
    
        RewriteRule ^ /%1 [P,L]
    

    But this takes me to a website redirect loop, with an incorrect address in the URL bar where the subdomain still exists.

    For example, x.domain.com takes me to x.domain.com/x and I get a redirect loop error.

    I'd be grateful if anyone can point me in the right direction! Nothing I change seems to work...

  • Newnab
    Newnab almost 11 years
    I tried this, but I'm getting some errors... [Sun May 26 13:02:28 2013] [error] [client 2.126.187.186] Attempt to serve directory: proxy:domain.com/x [Sun May 26 13:02:29 2013] [error] [client 2.126.187.186] File does not exist: proxy:domain.com/x/favicon.ico
  • Newnab
    Newnab almost 11 years
    And when I visit the URL x.domain.com I get a 404, which says: The requested URL / was not found on this server.
  • meberhard
    meberhard almost 11 years
    did it work before, when you had the flag "L" instead of "P"? I usually get the message "Attempt to serve directory: proxy:domain.com/x", when mod_proxy is not enabled! And just to be sure, you replaced "domain.com" with your real domain?
  • Newnab
    Newnab almost 11 years
    Aha! Mod_proxy wasn't enabled, that was it! I googled myself some answers on how to enable it and now it seems to be working! Thanks! I'll tick this.
  • Newnab
    Newnab almost 11 years
    Ahhhh, hang on! Now I'm getting a redirect loop on www.domain.com, where it's trying to go to www.domain.com/www/www/www/www etc!
  • Newnab
    Newnab almost 11 years
    OK, I needed to put this line back in: RewriteCond %{HTTP_HOST} !^(www)\. [NC] - Scared me for a second there!
  • Ben Sinclair
    Ben Sinclair about 10 years
    Worked for me: RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com RewriteRule ^(.*)$ http://domain.com/%1/$1 [P,NC,QSA]
  • Jeff Vdovjak
    Jeff Vdovjak over 9 years
    This works for me using the L flag, but when using the P flag, I am unable to go to the directory itself but must append the index file to it. For example, when using the L flag I can go to: sub.domain.com and it will redirect me to domain.com/sub (and display index.php) But using P: sub.domain.com doesn't work but sub.domain.com/index.php does work How can I fix this?
  • Dan Bray
    Dan Bray about 8 years
    You don't need to use mod_proxy. See my solution.
  • Rotimi
    Rotimi about 4 years
    Can you please help me out? I would like to redirect john.website.com to app.website.com/sort.php while keeping john.website.com in the address bar