Monday, February 7, 2011

Apache rewrite based on subdomain

Im trying to redirect requests for a wildcard domain to a sub-directory.
ie. something.blah.domain.com --> blah.domain.com/something

I dont know how to get the subdomain name to use in the rewrite rule.

Final Solution:

RewriteCond %{HTTP_HOST} !^blah\.domain\.com
RewriteCond %{HTTP_HOST} ^([^.]+)
RewriteRule ^(.*) /%1/$1 [L]

Or as pointed out by pilif

RewriteCond %{HTTP_HOST} ^([^.]+)\.media\.xnet\.tk$
  • You should have a look at the URL Rewriting Guide from the apache documentation.

    The following is untested, but it should to the trick:

    RewriteCond %{HTTP_HOST} ^([^.]+)\.blah\.domain\.com$
    RewriteRule ^/(.*)$           http://blah.domain.com/%1/$1 [L,R]
    

    This only works if the subdomain contain no dots. Otherwise, you'd have to alter the Regexp in RewriteCond to match any character which should still work due to the anchoring, but this certainly feels saver.

    From pilif
  • Try this:

    RewriteCond %{HTTP_HOST} (.+)\.blah\.domain\.com
    RewriteRule ^(.+)$ /%1/$1 [L]
    

    @pilif (see comment): Okay, that's true. I just copied a .htaccess that I use on one of my projects. Guess it has a slightly different approach :)

    pilif : your solution does not redirect to blah.domain.com but just rewrites to something.blah.domain.com/something, which is not how I read the original question.
    Ted Percival : I guess that is OK if they are both served by the same VirtualHost. In particular, doing it this way means the client doesn't see the redirection - they still see something.blah.example.com.
    From BlaM
  • Thanks, but i cant get it to work. here is what i have so far:

    <VirtualHost *:80>
        ServerName media.xnet.tk
        ServerAlias *.media.xnet.tk
        DocumentRoot /var/www/media
    
        RewriteEngine On
        RewriteLog "/var/log/apache2/rewrite.log"
        RewriteLogLevel 4
        RewriteCond ${HTTP_HOST} ^([^\.]+)\.media\.xnet\.tk$
        RewriteRule ^(.*)$ /%1/$1 [L]
    </VirtualHost>
    

    From Log: RewriteCond: input='${HTTP_HOST}' pattern='^([^\.]+)\.media\.xnet\.tk$' => not-matched

    Ted Percival : Make sure your request is using HTTP/1.1 if you want to match the Host header like that.
    From Sam
  • @Sam

    your RewriteCond line is wrong. The expansion of the variable is triggered with %, not $.

    RewriteCond %{HTTP_HOST} ^([^\.]+)\.media\.xnet\.tk$
                ^
    

    that should do the trick

    Sam : HA! the one character typo strikes again :(
    From pilif

0 comments:

Post a Comment