lunes, 27 de junio de 2011

Subdominios dinamicos con php y codeigniter

Una pregunta muy recurrente en internet y los foros es: ¿Se puede hacer subdominios dinamicos con php?¿Como se hacen estos subdominios dinamicos con php?, en muchas partes la gente pregunta pero pocas veces hay una respuesta clara y contundente, en este tutorial tratare de explicar como se hace, y veran que no es tan complicado como parece.

Lo primero que necesitamos es tener algunos conocimeintos basicos de:

¿Que es un Subdominio?
http://es.wikipedia.org/wiki/Subdominio
¿Que es un Servidor Dns.?
http://es.wikipedia.org/wiki/Domain_Name_System

Sistema de nombres de dominio o DNS: es un sistema que se creo con la finalidad de hacer mas claro el internet para todos, antes para accesar a una pagina web habia que poner la direccion ip del servidor al que nos queriamos conectar, por supuesto esto hacia muy dificil recordar de que era esa pagina e inclusive cual era su ip, para evitar esos problemas se crearon los DNS que son nombres de dominios que estan asociados a una direccio ip y de esta manera se facilita la compresion y uso de las paginas web.

Todos sabesmos que las url de una pagina siempre tienen una estructura parecida a esta:
www.google.com
  • www: subdominio
  • google: nombre de dominio
  • com: dominio de nivel superior
 Ahora bien, si nosotros deseamos crear un subdominio en nuestro servidor apache, debemos modificar el httpd.conf y agregar las siguientes lineas:

<VirtualHost *>
        ServerAdmin webmaster@ejemplo.com
        ServerAlias subdominio.ejemplo.com
        DocumentRoot /var/www/subdominio.ejemplo.com
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/subdominio.ejemplo.com>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
                # Uncomment this directive is you want to see apache2's
                # default start page (in /apache2-default) when you go to /
                #RedirectMatch ^/$ /apache2-default/
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/subdominio.ejemplo.com.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/subdominio.ejemplo.com.log combined
        ServerSignature On

</VirtualHost>

Donde dos cosas importantes para destacar son el ServerAlias y DocumentRoot, con el ServerAlias especificamos el nombre del subdominio y con el DocumentRoot espcificamos la ruta que debe accesar para buscar el subdominio,


Aparte de la configuracion en el apache debemos agregar en nuestro servidor DNS una entrada "A" con la ruta completa del subdominio y la direccion ip de nuestro mismo servidor, con estas dos cosas ya tenemos un subdominio creado en nuestro servidor. Ya si entramos en el subdominio deberia salirnos lo que tenemos en la ruta especificada.

Ahora bien si queremos hacer multiples subdominios con php, debemos seguir los paso anterirores pero con algunas diferencias, la primera es que al agregar el host al pache hay que poner en el Server alias en ves del subdominio poner *, queda asi: ServerAlias *.ejemplo.com

Y en la entrada "A" Del servidor dns en ves de poner  subdominio.ejemplo.com, colocar *.subdominio.ejemplo.com, con esto ya tenemos todos los subdominios de nuestro servidor apuntando a DocumentRoot, ahora bien para manejarlos ya esto queda de parte de php, Podemos crear un nuevo proyecto con codeginiter o dejarlo en con el que ya hemos estado trabajando, lo que hay que hacer es que en el controlador por defecto agregar las siguientes lineas:

    function _remap($method)
    {
        if($_SERVER['SERVER_NAME']!= 'localhost' && $_SERVER['SERVER_NAME'] != '127.0.0.1')
        {
            $array = explode('.',$_SERVER['SERVER_NAME']);
            if($array[0]!='www')
            {
                $method=$array[0];
            }
            elseif($array[0]=='www')
            {
                $method=$array[1];
            }
        }
            switch ($method)
            {
                case 'index':
                $this->index();
                break;
                default:
               $ths->lo que queramos.
            }
        
    }

Lo que hacemso es si es el servidor local carga el metodo tal cual como esta escrito si no es el servidor local pues estrae el subdominio y lo pasa como metodo, ya despues nosotros dentro del swicth podemos crear diferentes metodos a nuestor antojo y de esa maneja generar los subdominios dinamicos como queramos.

Si trabajamos con hmvc pues se nos hace la vida un poco mas facil ya que no tenemos que crear el metodo dnetro de el archivo del controlador sinoq ue lo hacemos aparte con lo cual nuestro codigo es mas facil de entender y todo se encuentra mejor organizado, solo deberiamso agregar:

$this->load->module('empresa');
 $this->empresa->index($method);

6 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. A ver, dime si lo que entendí es lo que explicas, porque ya me estoy emocionando.
    Se supone que con el código que muestras podemos generar subdominios dentro de las
    aplicaciones así como algunas le generas sub dominio a sus usuarios registrados?
    Poe ejemplo en www.invoicera.com, cuando te registras te genera un subdominio con el nombre
    del usuario con el que te registras, esta manera tienes acceso mendiante mi_usuario.invoicera.com,
    así funcionaría esto? o mejor dicho, así se podría aplicar?

    ResponderEliminar
  3. pues si emocionate que para eso mismo es. Hay trato de explicar como hacerlo. Hace tiempo lo hice en un proyecto personal y por eso lo puse aqui.

    ResponderEliminar
  4. Que bárbarooo!!! es lo que quería saber desde hace tiempo, sin embargo, tengo no una, muuuchas dudas que ojalá me pudieras ayudar con ellas.
    Primeramente. mencionas que si deseamos crear un subdominio hay que modificar el httpd.conf, pero, ¿es necesario hacer eso cuando tenemos una cuenta de hospedaje con un panel de administración y creamos desde ahí los subdominios?
    La segunda: Cuando tenemos contratado un plan de hospedaje compartido hay muchas restricciones para hacer modificaciones, por lo que no creo que haya manera de modificar el ServerAlias para cambiarlo a *.ejemplo.com, a menos que se solicite al proveedor y este lo haga. Ahora, ¿hay alguna otra manera de modificar el ServerAlias?
    La tercera: En los proyectos que últimamente he trabajado utilizo HMVC, porque me parece que se organiza mejor el proyecto. ¿Cuándo se utiliza $this->load->module('empresa'); $this->empresa->index($method);?
    Bueno, muchas preguntas, espero no importunarte.

    ResponderEliminar
  5. Primero te respondo la primera y la segunda juntas, Cuando estas creando un subdominio puedes agregar algo que se llama wildcards(que es simplemente el *), todo depende de el panel y la empresa. Pero yo lo e configurado en hosting compartidos y privados, todo depende de la empresa que lo contrates.

    No conozco otra manera de agregar los *, es decir todo queda en manos de las politicas de la empresa.

    La tercera: esas dos lineas de codigo, simplemente estoy cargando el controlador que tienes todas las funciones y que se va a encargar de manejar la solicitud, porque sino me tendría que poner a hacerlo en el propio index y esa no es la idea.



    La tercera: En los proyectos que últimamente he trabajado utilizo HMVC, porque me parece que se organiza mejor el proyecto. ¿Cuándo se utiliza $this->load->module('empresa'); $this->empresa->index($method);?
    Bueno, muchas preguntas, espero no importunarte.

    ResponderEliminar
  6. Sin duda que es un buen post, pero un inconveniente cuando ya estoy con el subdominio y quiero cargar el template no me carga no muestra nada solo la pagina en blanco usted sabe por que?.

    Gracias

    ResponderEliminar