Tuesday, 27 May 2014

dynamic subdomains in codeigniter with htaccess



a solution for implementing dynamic subdomains in codeigniter with htaccess. I was able to make it work for me so I am sharing this with you.
First make sure that subdomains are enabled on your site. When you enter test.yoursite.com it should take you to the welcome page of your site. If instead it gives DNS lookup error then it means subdomains is not enabled on your site.
To enable subdomains on your site add *.yoursite.com entry to the DNS Zone records.
Second insert the following code in your .htaccess file and replace yoursite appropriately.
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    #codeigniter specific rule
    RewriteCond %{REQUEST_URI} ^system.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #codeigniter specific rule
    RewriteCond %{REQUEST_URI} ^application.*
    RewriteRule ^(.*)$ /index.php?/$1 [L]

    #this rule removes www from the URL if its used
    RewriteCond %{HTTP_HOST} ^www.
    RewriteRule ^(.*)$ http://yoursite.com/$1 [R=301,L]

    #the auth system URIs which don't have subdomains
    RewriteCond %{HTTP_HOST} ^yoursite.
    RewriteRule ^(signup|signin|forgot_password)/?$ index.php?/auth/$1 [L]

    #this rule handles the subdomains
    RewriteCond %{HTTP_HOST} ^([a-z0-9]+).yoursite.com
    RewriteRule ^(.*)$ index.php?/public_site/%1/$1 [L]
</IfModule>

<IfModule !mod_rewrite.c>
    ErrorDocument 404 /index.php
</IfModule>
Add more rules, if necessary, for handling auth system or subdomains. I know I did for my site to get pretty URIs.

Important Note:

I found that by default the subdomain URIs work very well with codeigniter without any of the above rules. You can access all of your site with test.yoursite.com/# URI instead of www.yoursite.com/#. But the URIs are not pretty and there would be more than one way to access a URI.
So if you use the above rules it will give you pretty URIs and, more importantly, will give you unique URIs. So if you use the above rules you will only get one URI for the signup page and that is http://yoursite.com/signup


Share:

1 comment:

  1. I have $config['uri_protocol'] = 'AUTO';
    and system/core/URI.php::_fetch_uri_string detects in section:
    // Let's try the REQUEST_URI first, this will work in most situations
    if ($uri = $this->_detect_uri())
    {
    //print_r($uri);die;
    $this->_set_uri_string($uri);
    return;
    }

    that $uri == '/' for case http://yoursite.com/signup

    $this->_detect_uri() returns '/'.

    ReplyDelete