Разработка на Yii в субдоменах

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Разработка на Yii в субдоменах

Сообщение pioneer »

Привет всем!

Данный вопрос относится скорее к "архитекторам" приложений - т.е. ко всем нам :D Ребят, хотелось бы услышать от вас дельные советы по поводу того как лучше организовать приложение на Yii с учетом поддоменов. Поясню. Сейчас очень часто на сайтах многих интернет-магазинов (и не только) можно встретить подобное разделение категорий товаров (или разделов сайта - можно трактовать и так):

Одежда для мужчин => mens.site.com
Одежда для женщин => womens.site.com

Или, возможно, даже еще "продвинутее":

Одежда для мужчин => mens.clothes.site.com
Одежда для женщин => womens.clothes.site.com

Ранее я выводил необходимую категорию с помощью нужного метода контроллера по алиасу, и с использованием нужного правила для urlManager это выглядело, например, как-то так: site.com/clothes/mens. А как быть в случае с поддоменами? С точки зрения архитектуры mens.clothes.com может выступать и в качестве поддомена для самой обычной категории "Одежда для мужчин", созданной через панель администратора и хранящейся в БД, так и целым разделом "Одежда для мужчин" на сайте site.com, со своим макетом, версткой и пр.

Вопрос в том, собственно, как это правильно и при этом довольно несложно организовать (учитывая, что веб-приложение, представляющее собой сайт у нас одно)? И, самое, главное - какая при этом должна быть файловая структура проекта (вытекающий вопрос - работа с MVC "не по шаблону" - это как!?). Я примерно представляю, что возможно решением являются определенные махинации с .htaccess и компонентом urlManager, но не совсем уверен, что это действительно так.

Буду очень благодарен вам за помощь и дельные советы. Заранее большое спасибо!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Разработка на Yii в субдоменах

Сообщение ElisDN »

UrlManager нормально работает с поддоменами. Главное не забыть корневой домен для всех остальных адресов прописать:

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

'http://site.com' => 'site/index',
'http://site.com/<action:login|logout>' => 'site/<action>',
'http://<category:\w+>.site.com' => 'catalog/category',
и указать родительский домен для cookies.
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Разработка на Yii в субдоменах

Сообщение pioneer »

ElisDN писал(а):UrlManager нормально работает с поддоменами. Главное не забыть корневой домен для всех остальных адресов прописать:

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

'http://site.com' => 'site/index',
'http://site.com/<action:login|logout>' => 'site/<action>',
'http://<category:\w+>.site.com' => 'catalog/category', 
и указать родительский домен для cookies.
А можно подробнее, пожалуйста? Не совсем понял фразы "корневой домен для всех остальных адресов прописать" и "указать родительский домен для cookies". Под "корневым доменом" вы имели в виду что-то вроде этого?

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

'http://site.com' => 'site/index',
'http://ru.site.com' => 'site/index',
'http://ua.site.com' => 'site/index' 
Разрабатываю проект под Yupe 0.9.8. Для своих нужд нашел в сети вот это решение (перевод из кукбука). Сделал все, как написано в руководстве и даже в поведениях и компоненте urlManager убрал ненужные на мой взгляд вещи "из коробки Юпи":

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

/*'behaviors' => [
        'onBeginRequest' => [
            'class' => 'yupe\components\urlManager\LanguageBehavior'
        ]
],*/
'urlManager' => [
            /*'class' => 'yupe\components\urlManager\LangUrlManager',
            'languageInPath' => true,
            'langParam' => 'language',*/
            'class' => 'CUrlManager', // использую стандартный класс
            'urlFormat' => 'path',
            'urlSuffix' => '',
            'showScriptName' => false,
            'cacheID' => 'cache',
            'useStrictParsing' => true,
            'rules' => [
            // ...
            ]
], 
Если обратить внимание, то в руководстве указано, что правила для каждого из языков должны быть свои, именуются как {languageCode}.php (например, ru.php), а пути к файлам указываются при конфигурировании используемого компонента:

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

'i18n' => [
            'class' => 'application.modules.mymodule.components.I18n',
            'urlRulesPath' => realpath(Yii::getPathOfAlias('application') . '/modules/mymodule/i18n/urlRules'),
            'supportedLanguages' => [
                ['code' => 'en', 'name' => 'english', 'fallback' => true],
                ['code' => 'ru', 'name' => 'russian'],
            ],
], 
Ура! Компонент правильно подключился и уже работает - при запросе http://mysite.com/ редиректит на http://ru.mysite.com/, однако тут и возникла ошибка - "Сервер не найден" в Firefox и DNS_PROBE_FINISHED_NXDOMAIN в Chrome. С чем это может быть связано? Правила ('rules' => ...) из общего компонента urlManager (который в config.php) в соответствующий файл(ы) (те, что в папке /i18n/urlRules/) я перенес как они и были до этого:

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

'/' => '/mymodule/site/index', // для индексной страницы это правило всегда раньше срабатывало корректно
//...
 
- поскольку как было отмечено пользователями в комментариях к рецепту (и насколько я понял из кода компонента) - то, что в правилах urlManager (из config.php) отныне теряет смысл.

Локально я работаю под Open Server 5.2.2 [PHP-5.4 / Apache-2.2]. Может в .htaccess нужно было еще что-либо менять/указывать?
Буду очень признателен вам за помощь! А тем, кто уже использовал этот компонент или хотя бы неплохо вник в его суть, у меня вопрос: скажите, как можно организовать вывод адреса сайта для языка по умолчанию без префикса языка? То есть к примеру на сайте у нас язык по умолчанию - английский (en), тогда при определении английского языка пользователя как наиболее предпочтительного редирект выполняется не на http://en.mysite.com/, а просто на http://mysite.com/, во всех же остальных случаях - согласно логике.

Большое спасибо заранее! :)
pioneer
Сообщения: 136
Зарегистрирован: 2013.03.10, 23:27

Re: Разработка на Yii в субдоменах

Сообщение pioneer »

На всякий случай прикрепляю структуру своего .htaccess (он остался стандартным, как "из коробки" Юпи, насколько я помню)

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

AddDefaultCharset utf-8
Options +FollowSymLinks
IndexIgnore */*

ServerSignature Off
php_flag expose_php Off

<IfModule mod_deflate.c>
    # выставляем заголовок Content-Encoding: gzip
    AddEncoding gzip .gz

    # для favicon.ico
    AddOutputFilterByType DEFLATE image/x-icon
    # также для CSS- и JavaScript-файлов
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE text/css

    # отключаем сжатие для тех браузеров, у которых проблемы
    # с его распознаванием
    BrowserMatch "MSIE [456]" no_gzip dont-vary
    BrowserMatch "SV1;" !no_gzip !dont-vary
    BrowserMatch "Opera" !no_gzip !dont-vary
    BrowserMatch "Firefox/[0-3]\." gzip-only-text/html
    BrowserMatch "Firefox/3\.[1-9]" !gzip-only-text/html
    BrowserMatch "Chrome/2" gzip-only-text/html
    BrowserMatch "Safari" gzip-only-text/html
    BrowserMatch "Konqueror" gzip-only-text/html
</IfModule>

<IfModule mod_expires.c>
    # включаем кэширование для всех файлов сроком на 10 лет
    ExpiresActive On
    ExpiresDefault "access plus 4 days"

    # отключаем его для HTML-файлов
    <FilesMatch .*\.(shtml|html|phtml|php)$>
        ExpiresActive Off
    </FilesMatch>
</IfModule>

<IfModule mod_headers.c>
    # указываем прокси-серверам передавать заголовок User-Agent
    # для корректного распознавания сжатия
    Header append Vary User-Agent env=!dont-vary

    # запрещаем кэширование на уровне прокси-сервера для всех
    # файлов, для которых у нас выставлено сжатие,
    <FilesMatch .*\.(css|js|php|phtml|shtml|html|xml)$>
        Header append Cache-Control: "private, must-revalidate"
    </FilesMatch>
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine on
    
    # Универсальный редирект с домена С www. на домен БEЗ www
    # при необходимости - раскомментировать:
    #
    # RewriteCond %{HTTPS} !=on
    # RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    # RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

    # prevent httpd from serving dotfiles (.htaccess, .svn, .git, etc.)
    RedirectMatch 403 /\..*$

    # if a directory or a file exists, use it directly
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    # otherwise forward it to index.php
    RewriteRule . index.php
</IfModule>
Ответить