Субдомены, ведущие к контроллерам Codeigniter?
Это похоже на общий запрос, но я не смог найти окончательные инструкции о том, как это сделать.
Я хотел бы, чтобы субдомен запускал определенный контроллер в моей установке CI. Например:
students.mysite.com: откроется mysite.com/students (технически: mysite.com/index.php/students. контроллер: студенты)
teachers.mysite.com: откроется mysite.com/teachers
Сохраняя субдомен при прохождении глубже. Например:
students.mysite.com/help: откроется mysite.com/students/help (контроллер: students(), метод: помощь())
students.mysite.com/help/contact: откроет mysite.com/students/help/contact (контроллер: students(), метод: help(), аргумент: "контакт" )
students.mysite.com/help/contact/email: откроет mysite.com/students/help/contact (контроллер: students(), метод: help(), аргументы: "контакт", "электронная почта" )
Я понимаю, что something.mysite.com теперь возвращает ошибку. Поэтому я полагаю:
Шаг 1 позволит anything.mysite.com возвращать root (mysite.com/index.php)
Шаг 2 будет считывать субдомен и вызывать этот контроллер
Шаг 3 будет считывать первый аргумент после первого "/" и вызывать этот метод контроллера и передавать оставшиеся части URL в качестве аргументов
Я думаю, что на самом деле я озадачен Шаг 1. Я нахожусь в учетной записи с общим хостингом, это что-то, что я могу сделать с помощью CPanel? Я попробовал добавить субдомен для *. Mysite.com без всякой удачи (если только мне не нужно было ждать больше времени для распространения, но я чувствую, что шансы выше, что я ошибался).
Вернувшись на мою домашнюю установку WAMP, я бы изменил httpd.conf, правильно? Могу ли я получить этот эффект без изменения этого файла (поскольку я, вероятно, не могу, поскольку я использую webhostinghub.com)
Спасибо, за ваше время!
- Кейт
Ответы
Ответ 1
Как вы хотите использовать определенный домен, чтобы привести к вашим контроллерам, то, что я придумал, использовал файл application/config/routes.php
для его достижения. Идея заключается в загрузке разных контроллеров в зависимости от того, какой субдомен вы используете, поэтому вместо написания списка маршрутов для вашего домена вы пишете список маршрутов ЗАВИСИМОСТИ в домене, к которому вы обращаетесь:
switch ( $_SERVER['HTTP_HOST'] ) {
case 'students.mysite.com':
$route['default_controller'] = "students";
break;
case 'teachers.mysite.com':
$route['default_controller'] = "teachers";
default:
// The list of your $routes lines at is was...
break;
}
Чтобы сделать эту работу, вы должны указать только субдомен в свой проект CI (Dwayne Towell в шаге 1 другого ответа объясняет, как это сделать отлично), и у вас будет все, что вы делаете, t быть проблемой, и вам не придется настраивать сервер.
Ответ 2
Шаг 1: В CPanel, в доменах, в поддоменах, добавьте *.mysite.com
(вы вводите только часть *
) для перенаправления на /public_html/
(вы не вводите ничего и/или удаляете подстановочный знак) (или установите для этого значение независимо от текущего значения по умолчанию для www.mysite.com.
Шаг 2 и 3: используйте mod_rewrite, чтобы захватить субдомен и перенести его в часть "directory" URL. Я подозреваю, что это будет что-то вроде: (но я еще не пробовал, RewriteLogLevel 9 - ваш друг)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^\.]+)\.mysite\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/index.php/%1/$1 [L]
Я также не знаю, можете ли вы сделать выше, используя .htaccess
. Я только сделал переписывание из httpd.conf.
Ответ 3
В файле application/config/routes.php вам нужно написать
$subDomains = array();
$subDomains['students.mysite.com'] = "student";
$subDomains['teachers.mysite.com'] = "teachers";
if(array_key_exists($_SERVER['HTTP_HOST'], $subDomains)) {
$route['default_controller'] = $subDomains[$_SERVER['HTTP_HOST']];
}
Ответ 4
!!!
Очень важным шагом, который вы не хотите забывать в дополнение к замечательному примеру Chococroc, является перенаправление любых сегментов обратно на контроллер субдомена, иначе вы закончите маршрутизацию на контроллер, который, вероятно, не существует. Пример использования существующего кода Chococroc
switch ( $_SERVER['HTTP_HOST'] ) {
case 'students.mysite.com':
$route['default_controller'] = "students";
break;
case 'teachers.mysite.com':
$route['default_controller'] = "teachers";
default:
// The list of your $routes lines at is was...
break;
}
Переход на "teachers.mysite.com/login" будет загружать контроллер "login" НЕ ожидаемый "учительский контроллер".
Если вы не хотите этого неожиданного поведения, вам нужно перенаправить любые сегменты обратно в контроллер поддомена. Теперь они будут функцией этого контроллера.
switch ( $_SERVER['HTTP_HOST'] ) {
case 'students.mysite.com':
$route['default_controller'] = "students";
$route['(:any)'] = "students/$1";
break;
case 'teachers.mysite.com':
$route['default_controller'] = "teachers";
$route['(:any)'] = "teachers/$1";
default:
// The list of your $routes lines at is was...
break;
}
Переход на "teachers.mysite.com/login" теперь загрузит "учительский контроллер" и запустит функцию "входа" в этом контроллере.
Есть другие вещи, которые вы можете применить, например, вложенную папку для каждого домена и т.д.