Динамическое создание поддоменов - PullRequest
5 голосов
/ 02 августа 2010

Я создаю веб-сайт с использованием MVC Framework (Yii), и мне нужно динамически создавать субдомены, т.е. http://company.website.com

Итак, для достижения этого я добавил подстановочный знак DNS (* .website.com). Теперь проблема в том, что мои контроллеры приложений одинаковы для www.website.com и company.website.com. Например, у меня есть контроллер User с действием Register (user/register). Теперь, если я захожу на www.website.com / user / register , я могу зарегистрироваться, но я могу сделать точно то же самое, если я захожу на company.website.com / пользователь / регистрация . И это поведение одинаково для всех моих контроллеров.

Я понимаю, что все работает правильно, но как мне отделить контроллеры для www.website.com и compnay.website.com? Я не хочу, чтобы пользователи обращались к регистратору / логину / другим контроллерам и действиям из субдомиального URL.

Любые предложения приветствуются!

Спасибо!

Ответы [ 2 ]

4 голосов
/ 03 августа 2010

Вы можете включить имя хоста в массив правил маршрутизации.Например, вы можете создать правила

array(
    'http://www.website.com/user/register' => 'user/register',
    'http://<company:\w+>.website.com/user/register' => 'other/route',
)

и проверить параметр company в вашем действии other/route.Обратите внимание, что для работы этих правил требуется http://.Для получения дополнительной информации см. Документацию CUrlManager .

PS Если контроллеры для http://www.website.com и http://company.website.com/user/register полностью отличаются, может быть лучше настроить два приложения для этих сайтов.

2 голосов
/ 06 августа 2010

Если я понимаю ваш вопрос, компонент «компания» в URL-адресе представляет собой переменное название компании.Я продолжу свой ответ в этом предположении.

Другой вариант - создать модуль компании (сейчас я назову его «Компании») и использовать правила CUrlManager для маршрутизации на этот контроллер.Например,

array(
    'http://<company:\w+>.website.com/user/register' => '/companies/user/register',
    'http://<company:\w+>.website.com/<_c:\w+>/<_a:\w+>' => '/companies/<_c>/<_a>' // more generic option
),

Строка 'company' будет передана приложению как $ _GET ['company'], и вы можете использовать этот параметр в файле CompaniesModule.php для загрузки некоторых специфических данных компании.

Обратите внимание, что без каких-либо других правил обработки запросов на веб-сайте www.website.com (согласно ответу Grey Teardrop) вы получите ошибки при запросах к этому поддомену.

...