Привет всем!
Данный вопрос относится скорее к "архитекторам" приложений - т.е. ко всем нам Ребят, хотелось бы услышать от вас дельные советы по поводу того как лучше организовать приложение на 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, но не совсем уверен, что это действительно так.
Буду очень благодарен вам за помощь и дельные советы. Заранее большое спасибо!
Разработка на Yii в субдоменах
Re: Разработка на Yii в субдоменах
UrlManager нормально работает с поддоменами. Главное не забыть корневой домен для всех остальных адресов прописать:
и указать родительский домен для cookies.
Код: Выделить всё
'http://site.com' => 'site/index',
'http://site.com/<action:login|logout>' => 'site/<action>',
'http://<category:\w+>.site.com' => 'catalog/category',
Re: Разработка на Yii в субдоменах
А можно подробнее, пожалуйста? Не совсем понял фразы "корневой домен для всех остальных адресов прописать" и "указать родительский домен для cookies". Под "корневым доменом" вы имели в виду что-то вроде этого?ElisDN писал(а):UrlManager нормально работает с поддоменами. Главное не забыть корневой домен для всех остальных адресов прописать:
и указать родительский домен для cookies.Код: Выделить всё
'http://site.com' => 'site/index', 'http://site.com/<action:login|logout>' => 'site/<action>', 'http://<category:\w+>.site.com' => 'catalog/category',
Код: Выделить всё
'http://site.com' => 'site/index',
'http://ru.site.com' => 'site/index',
'http://ua.site.com' => 'site/index'
Код: Выделить всё
/*'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' => [
// ...
]
],
Код: Выделить всё
'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'],
],
],
Код: Выделить всё
'/' => '/mymodule/site/index', // для индексной страницы это правило всегда раньше срабатывало корректно
//...
Локально я работаю под Open Server 5.2.2 [PHP-5.4 / Apache-2.2]. Может в .htaccess нужно было еще что-либо менять/указывать?
Буду очень признателен вам за помощь! А тем, кто уже использовал этот компонент или хотя бы неплохо вник в его суть, у меня вопрос: скажите, как можно организовать вывод адреса сайта для языка по умолчанию без префикса языка? То есть к примеру на сайте у нас язык по умолчанию - английский (en), тогда при определении английского языка пользователя как наиболее предпочтительного редирект выполняется не на http://en.mysite.com/, а просто на http://mysite.com/, во всех же остальных случаях - согласно логике.
Большое спасибо заранее!
Re: Разработка на Yii в субдоменах
На всякий случай прикрепляю структуру своего .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>