рядом, как я могу сказать, это поведение нормальное.
Я смотрел документы и код, и кажется, что маршрутизатор загрузит контроллер/действие по умолчанию по URL-адресу, например /en/mmm
. Язык: en действителен, но mmm
не соответствует действующему модулю или контроллеру, поэтому используется маршрут по умолчанию.
В случае en/mmm/ccc
он выбрасывает 404, потому что в отсутствие действительного модуля маршрут будет соответствовать контроллеру/действию, а потому что значения недействительны, приведет к 404. Я уверен, почему это приводит к ошибке 404, а недопустимый контроллер просто приводит к вызову по умолчанию.
Эта активность проявляется в степени в этих примерах из Default Routes:
// Assuming the following: $ctrl->setControllerDirectory(
array(
'default' => '/path/to/default/controllers',
'news' => '/path/to/news/controllers',
'blog' => '/path/to/blog/controllers'
));
Module only: http://example/news
//if not valid module would attempt to match controller.
//if not valid controller would call default route
module == news
Invalid module maps to controller name: http://example/foo
controller == foo
Module + controller: http://example/blog/archive
module == blog
controller == archive
Module + controller + action: http://example/blog/archive/list
//all three must be valid or 404
module == blog
controller == archive
action == list
Module + controller + action + params:
http://example/blog/archive/list/sort/alpha/date/desc
module == blog
controller == archive
action == list
sort == alpha
date == desc
Следующий фрагмент кода, кажется, самый лучший пример, который я нашел, где демонстрируется такое поведение.
//excerpt from Zend_Controller_Router_Route_Module
if ($this->_moduleValid || array_key_exists($this->_moduleKey, $data)) {
if ($params[$this->_moduleKey] != $this->_defaults[$this->_moduleKey]) {
$module = $params[$this->_moduleKey];
}
}
unset($params[$this->_moduleKey]);
$controller = $params[$this->_controllerKey];
unset($params[$this->_controllerKey]);
$action = $params[$this->_actionKey];
unset($params[$this->_actionKey]);
foreach ($params as $key => $value) {
$key = ($encode) ? urlencode($key) : $key;
if (is_array($value)) {
foreach ($value as $arrayValue) {
$arrayValue = ($encode) ? urlencode($arrayValue) : $arrayValue;
$url .= self::URI_DELIMITER . $key;
$url .= self::URI_DELIMITER . $arrayValue;
}
} else {
if ($encode) $value = urlencode($value);
$url .= self::URI_DELIMITER . $key;
$url .= self::URI_DELIMITER . $value;
}
}
if (!empty($url) || $action !== $this->_defaults[$this->_actionKey]) {
if ($encode) $action = urlencode($action);
$url = self::URI_DELIMITER . $action . $url;
}
if (!empty($url) || $controller !== $this->_defaults[$this->_controllerKey]) {
if ($encode) $controller = urlencode($controller);
$url = self::URI_DELIMITER . $controller . $url;
}
if (isset($module)) {
if ($encode) $module = urlencode($module);
$url = self::URI_DELIMITER . $module . $url;
}
return ltrim($url, self::URI_DELIMITER);
}
Надеюсь, это поможет.
Хм, так как я хочу, чтобы иметь 404 в этой ситуации я применил "грязный" раствор в модуле по умолчанию, индекс контроллера: 'общественная функция indexAction() { если ($ this-> GetRequest() -> GetParam ('module')! = 'default') { throw new Zend_Controller_Action_Exception ($ this-> translate («Страница не найдена»), 404); } } ' – rukavina