В настоящее время у меня есть такой маршрут, определенный и работающий:
$route = new Zend_Controller_Router_Route
(
':token/:place/:controller/:action/*',
array
(
'module' => 'admin',
'controller' => 'public',
'action' => 'list',
'token' => 'default_company',
'place' => 'default_place'
),
array
(
'token' => '[a-z_]+',
'place' => '[a-z_]+'
)
);
$router->addRoute('admin', $route);
Таким образом, URL в приложении может быть myserver.com/google/europe/public/list
Клиенту нужны две дополнительные опции для доступа к одной и той же странице:
google.myserver.com/europe и google.com/europe
Все DNS будут обработаны и Apache будет настроен. В настоящее время мне нужно создать шаблоны для обработки этих маршрутов, но я не знаю, как мне извлечь поддомен и / или домен, используя его в качестве параметров И скрыть контроллер / действие (каким-то образом сделать их по умолчанию) при начальной загрузке. Может, делал это раньше и мог бы помочь?
Я создал такой шаблон для google.myserver.com/europe, но, похоже, он не решает проблему:
$route = new Zend_Controller_Router_Route
(
':token.*.*/:place/*',
array
(
'module' => 'admin',
'controller' => 'public',
'action' => 'list',
'token' => '',
'place' => ''
),
array
(
'token' => '[a-z_]+',
'place' => '[a-z_]+'
)
);
$router->addRoute('subdomain_route', $route);
Спасибо за любые указания, что я делаю не так.
Я нашел ответ, просто поделюсь, если кому-то это нужно. Я создал помощник, который я использую в контроллерах init (), чтобы получить organization_token и place_path. Он в значительной степени анализирует различные случаи URL и возвращает параметры:
public static function getOrganizationTokenAndPlacePath($token, $path)
{
$url = explode('.', $_SERVER['HTTP_HOST']);
$params = explode('/', $_SERVER['REQUEST_URI']);
$subdomain = $url[0];
$domain = $url[1];
$parsed = array();
if (($token == 'default_token' || $path == 'default_place') && $domain == DEFAULT_APP_DOMAIN){
// Case http://organization_token.domain.com/place_path/
$parsed['token'] = $subdomain;
$parsed['path'] = $params[1];
//die('Case1');
}
else if(($token == 'default_token' || $path == 'default_place') && $domain != DEFAULT_APP_DOMAIN){
// Case http://some_subdomain.organization_token.com/place_path/
$parsed['token'] = $domain;
$parsed['path'] = $params[1];
// If place_path is not found, try to get the last entered place_path from the database
if ($parsed['path'] == ''){
$organization_model = new Admin_Model_Organization();
$organization = $organization_model->getOrganizationByToken($parsed['token']);
$places = $organization_model->getOrganizationPlaces($organization['organization_id']);
if (sizeof($places) > 0){
$last_added_place = array_pop($places);
$parsed['path'] = $last_added_place['place_path'];
}
}
//die('Case2');
}
else if ($domain != DEFAULT_APP_DOMAIN && $subdomain == 'www'){
// Case http://www.organization_token.com/some_param/place_path/
$parsed['token'] = $domain;
$parsed['path'] = $params[2];
//die('Case3');
}
else{
// Case http://subdomain.domain.com/organization_token/place_path/
$parsed['token'] = $token;
$parsed['path'] = $path;
//die('Case4');
}
return $parsed;
}
Надеюсь, это поможет кому-то
Других решений пока нет …