Страница 1 из 1

привязать поддомен к модулю.

Добавлено: 2011.11.10, 11:06
suppergrower
Привет.
Проблема такая.
Есть сайт на Yii 1.1.7 содержащий админку и пользовательскую часть.
Админка должна располагаться по адресу http://site.com
Пользовательская часть по адресу http://domen.site.com
Подскажите в какую сторону копать.

Re: привязать поддомен к модулю.

Добавлено: 2011.11.10, 12:56
Nafania
в UrlManager есть возможность создавать правила используя доменные имена.
Вот тут глнять можно http://www.yiiframework.com/doc/guide/1 ... -hostnames

Re: привязать поддомен к модулю.

Добавлено: 2011.11.10, 13:14
suppergrower
Не совсем получается.
Делаю так:

Правило

Код: Выделить всё

'http://domain.site.com/' => 'user/', 
срабатывает и открывается дефолтная страница модуля user.

Но если к этому правилу добавить какие - либо именованные параметры для определения пары controller/action, то они почему-то берутся
не из модуля и соответственно выдается 404 ошибка.

Хотя контроллер и соотвтствующий актион есть в модуле.

То есть такой запрос
http://site.com/user/test
Откроет дефолтную страничку контроллера test.

А правило

Код: Выделить всё

'http://domain.site.com/<c:\w+>' => 'user/<c>' 
не срабатывает на запрос
http://domain.site.com/
Хотя, насколько я понял, должно.

Re: привязать поддомен к модулю.

Добавлено: 2011.11.10, 16:20
Ekstazi
У меня свой urlManager для таких целей, правда там домены второго уровня и хранятся они в БД.

Re: привязать поддомен к модулю.

Добавлено: 2011.11.10, 16:22
suppergrower
Пример можешь показать, что менять в нем надо? И как подключить его?

Re: привязать поддомен к модулю.

Добавлено: 2011.11.10, 16:25
Ekstazi

Код: Выделить всё

    public function parseUrl($request)
    {
        $route=parent::parseUrl($request);
        if(strpos($route,'admin')===0)
            return $route;
        /*
        $site=Site::model()->find('domain=?',array($request->getServerName()));
        // Если сайт неизвестен или не связан с сайтовым модулем
        if(!isset($site) || (/** @var $module SiteModule *//*$module=Yii::app()->getModule($site->module)) && !is_subclass_of($module,'SiteModule'))
            throw new CHttpException(404,'Неизвестное доменное имя, добавьте его через админку');

        return $module->getId().'/'.$route;
        */
        // Теперь нас. пункт
        /*
        if(!empty($_GET['location'])){
            $location=Location::model()->findByPath($_GET['location'],false);
            if(!isset($location))
                throw new CHttpException(404,'Такого нас. пункта не существует');
            Yii::app()->pageInfo->setLocation($location);
        }
        return $route;
        */
    }
 
Черновой вариант кода, еще в доработке.

Re: привязать поддомен к модулю.

Добавлено: 2011.11.10, 23:26
suppergrower
Как подключал свой класс? У меня не получилось.
Поэтому сделал бэкап исходного и прям в родном классе изменил метод.

Код: Выделить всё

    public function parseUrl($request)
    {
        if($this->getUrlFormat()===self::PATH_FORMAT)
        {
            $rawPathInfo=$request->getPathInfo();
            $pathInfo=$this->removeUrlSuffix($rawPathInfo,$this->urlSuffix);
            foreach($this->_rules as $rule)
            {
                if(($r=$rule->parseUrl($this,$request,$pathInfo,$rawPathInfo))!==false)
                    $return = isset($_GET[$this->routeVar]) ? $_GET[$this->routeVar] : $r;
            }
            if($this->useStrictParsing)
                throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
                    array('{route}'=>$pathInfo)));
            else
                $return = $pathInfo;
        }
        else if(isset($_GET[$this->routeVar]))
            $return = $_GET[$this->routeVar];
        else if(isset($_POST[$this->routeVar]))
            $return = $_POST[$this->routeVar];
        else
            $return = '';
            
    //----------------------------------------------------------------------------
        $rules = require(YiiBase::getPathOfAlias('ext') .'/subdomains.php');
        
        $subdomain = explode('.',getenv('HTTP_HOST'));
        $subdomain = $subdomain[0];
        if(array_key_exists($subdomain, $rules))
            $module = $rules[$subdomain];
        else
            $module = '';
        
        return $module .'/'. $return;
    } 
Массив $rules имеет такой вид

Код: Выделить всё

array('domain' => 'module',); 

Re: привязать поддомен к модулю.

Добавлено: 2011.11.11, 12:04
Johnatan
suppergrower писал(а): А правило

Код: Выделить всё

'http://domain.site.com/<c:\w+>' => 'user/<c>' 
не срабатывает на запрос
http://domain.site.com/
Хотя, насколько я понял, должно.
Не должно. Модификатор "+" означает 1 или множество. В адресе http://domain.site.com/ у вас нет ничего после /, то есть ноль. А ноль не предполагается модификатором "+", поэтому и не срабатывает.
Можно сделать отдельное правило для http://domain.site.com/