субдомены на локальном хосте против производственного сервера под CodeIgniter - PullRequest
3 голосов
/ 17 апреля 2011

Я пытаюсь настроить профили на поддоменах сайта разработки.«Профили» будут создаваться пользователем, то есть могут происходить в любое время.

Локально я знаю, что не могу использовать подстановочные записи хоста или что-либо еще (работает в среде MAMP, ОС 10.6), и яЯ не уверен, как идти о динамическом создании записей.Сайт работает на vhost.

Следующим препятствием, конечно же, является рабочий сервер, который является GS-сервером Media Temple (общим).Еще раз, я не знаю, как создать эти DNS-записи (в случае производственного сервера) автоматически.

Любая помощь / совет очень важны!

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

То, что вы ищете, может быть следующим:

DNS:

Создайте A-запись «все для всех» в вашем DNS (*.example.com).

Конфигурация Apache:

Добавьте в файл .htaccess следующее:

RewriteEngine On

# Extract the username from the subdomain
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC]
RewriteRule ^$ /profile.php?username=%1 [L]

PHP:

В вашем файле profile.php неожиданно появляется имя пользователя в переменной $ _GET ['username'].

0 голосов
/ 18 апреля 2011

Я не уверен, что понимаю, что CI имеет отношение к виртуальным хостам, но в последнее время я создал свои собственные функции VHost:

define('VHOST_FILE','/etc/httpd/conf.d/vhost.conf');

/**
 * Generate Apache vhost entry.
 * @param string $domain Domain or subdomain name (eg: foo.example.com or example.biz).
 * @param string $path Path to document root.
 * @return string The generated vhost entry.
 */
function vhost_gen($domain,$path){
    $eol=ISWIN ? CRLF : LF;
    return  '<VirtualHost *:80>'.$eol.
            TAB.'ServerName '.str_replace(array(' ',CR,LF,TAB,NULL),'',$domain).$eol.
            TAB.'DocumentRoot "'.str_replace(array(CR,LF,TAB,NULL),'',$path).'"'.$eol.
            '</VirtualHost>'.$eol.$eol;
}

/**
 * Writes the new vhost config file.
 * @param array $items List of objects(domain,docroot) used in config.
 */
function vhost_write($items){
    $eol=ISWIN ? CRLF : LF;
    $data='NameVirtualHost *:80'.$eol.$eol;
    foreach($items as $item)
        $data.=vhost_gen ($item->domain,$item->docroot);
    return @file_put_contents(VHOST_FILE,$data);
}

/**
 * Returns a list of vhost entries.
 * @return array List of objects(id,domain,docroot) entries.
 */
function vhost_read(){
    $entries=array();
    $lines=explode(LF,str_replace(CR,LF,@file_get_contents(VHOST_FILE)));
    $entry=null;
    foreach($lines as $line){
        // parse line
        $line=explode(' ',str_replace(TAB,' ',trim($line)),2);
        if(isset($line[0]))$line[0]=strtolower(trim($line[0]));
        // state engine
        if($line[0]=='<virtualhost'){
            $entry=new stdClass();
            continue;
        }
        if($line[0]=='</virtualhost>' && $entry!==null){
            $entry->id=count($entries)+1;
            $entries[$entry->id]=$entry;
            $entry=null;
            continue;
        }
        if($line[0]=='servername' && $entry!==null){
            $entry->domain=str_replace('"','',trim($line[1]));
            continue;
        }
        if($line[0]=='documentroot' && $entry!==null){
            $entry->docroot=str_replace('"','',trim($line[1]));
            continue;
        }
    }
    return $entries;
}

/**
 * Backup vhost config file.
 * @return boolean True on success, false otherwise.
 */
function vhost_backup(){
    if(!@file_exists(VHOST_FILE))
        return @file_put_contents(VHOST_FILE,'')
            && @copy(VHOST_FILE,ServerCentral::path().'vhost.conf.bak');
    return @copy(VHOST_FILE,ServerCentral::path().'vhost.conf.bak');
}

/**
 * Restore vhost backup file.
 * @return boolean True on success, false otherwise.
 */
function vhost_restore(){
    return @copy(ServerCentral::path().'vhost.conf.bak',VHOST_FILE);
}

/**
 * Restarts apache/httpd service daemon.
 * @return boolean True on success, false otherwise.
 */
function httpd_restart(){
    $r=System::execute('service httpd restart');
    return $r['return']==0;
}

Поскольку я в основном копирую и вставляю его, вы можетехотите заменить некоторые вещи:

  • ServerCentral::path() - Абсолютный путь к текущему запущенному скрипту.
  • System::execute - Запускает команду оболочки, работает точно так же, как this .
  • ISWIN - Определено так: define('ISWIN', strpos(strtolower(php_uname()),'win')!==false && strpos(strtolower(php_uname()),'darwin')===false );
...