Codeigniter: несколько доменов, но только 1 сайт - PullRequest
0 голосов
/ 09 июня 2011

Я пытаюсь настроить свой сайт, который может иметь разные домены для разных локалей, но он должен иметь только 1 кодовую базу.Прямо сейчас я должен перенаправить все остальные домены в основной домен и запустить свой сайт на этом домене.Мой вопрос заключается в том, можно ли настроить мой хост или мое приложение codeigniter, чтобы я мог размещать свое приложение во всех доменах без дублирования кодовой базы.Например: 2 сайта www.domain1.com и www.domain2.com должны работать на одном сервере, а www.domain1.com/controller/action и www.domain2.com/controller/action должны вызывать один и тот же файл контроллера.

Спасибо

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Я делаю что-то подобное, один и тот же код, но разные базы данных в зависимости от субдомена.У меня есть база данных с таблицей для доменов, отображающая «домен» в «имя_базы»:

    CREATE TABLE IF NOT EXISTS `empresas` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `database` char(10) NOT NULL,
  `active` tinyint(1) NOT NULL,
  `domain` char(255) NOT NULL
  PRIMARY KEY (`id`),
  KEY `domain` (`domain`)
) ;

, а затем базовый класс контроллера abtract, который делает магию:

<?php

class AB_Base_Controller extends CI_Controller {

    public $empresa;

    public function __construct() {

        parent::__construct();
        $this->empresa = $this->session->userdata('empresa');

        if ($this->empresa === FALSE || empty($this->empresa)) {
            $this->load->model('sistema_model', 'sistema');
            $this->empresa = $this->sistema->get_empresa();
            $this->session->set_userdata('empresa', $this->empresa );
        }

        // configure the client database
        $db['hostname'] = 'localhost';
        $db['username'] = "whatever";
        $db['password'] = "whatever";
        $db['database'] = 'tqm'.$this->empresa['database']; // the 'tqm' at the beginning is just for make difference with the rest of db
        $db['dbdriver'] = 'mysql';
        $db['dbprefix'] = '';
        $db['pconnect'] = TRUE;
        $db['db_debug'] = FALSE; //TRUE;
        $db['cache_on'] = FALSE;
        $db['cachedir'] = '';
        $db['char_set'] = 'iso-8859-1';
        $db['dbcollat'] = 'latin1_swedish_ci';
        $db['swap_pre'] = '';
        $db['autoinit'] = TRUE;
        $db['stricton'] = FALSE;

        $this->load->database($db, FALSE, TRUE);

    }

}

любойконтроллер, который наследует это, будет иметь сконфигурированную db.

модель:

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

//  CI 2.0 Compatibility
if(!class_exists('CI_Model')) { class CI_Model extends Model {} }


class Sistema_model extends CI_Model
{
    /**
     * Contiene el nombre de la tabla en la que se guardan los datos del dominio y la empresa cliente asociada
     *
     * @var string
     **/
    public $table = 'empresas';

    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Retorna la empresa basado en los datos de conexión
     *
     * @return array
     **/
    public function get_empresa()
    {
            $query = $this->db->select( 'id, database' )
                    ->where('active', 1)
                    ->where('domain',$_SERVER['SERVER_NAME'])
                    ->get($this->table);

            if( $query->num_rows() == 0 ) redirect('http://www.google.com');

            $result = $query->first_row('array');

            return $result;

    }

}

Извините за длину, но код объяснит лучше, чем мой плохой английский.

1 голос
/ 09 июня 2011

Все, что вам нужно сделать, это настроить виртуальные хосты и указать им один и тот же индексный файл.Так, например, если вы работали с nginx, у вас может быть что-то вроде:

server {
   url domain1.com;
   root /var/www/site/public;
}

server {
   url domain2.com;
   root /var/www/site/public;
}

Если вы не знаете, как настроить виртуальные хосты на вашем сервере, вам придется посмотреть, чтов соответствующей документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...