/** * Редирект с выходом из приложения. * * Прим.: указание абсолютного URL - требование спецификации HTTP/1.1, * {@link http://php.net/manual/ru/function.header.php} * * Быстрая справка по кодам с редиректом {@link http://php.net/manual/ru/function.header.php#78470} * * Хитрый редирект на основе комментария {@link http://php.net/manual/ru/function.headers-sent.php#60450} * * @param string $url новый относительный адрес, с ведущим слешем * @param int $code код ответа HTTP */ public static function redirect($url, $code = 302) { $url = Env::domainUrl() . $url; if (!headers_sent()) { header('location:' . $url, true, $code); } else { echo "\n <script type='text/javascript'>\n window.location.href='{$url}'\n </script>\n <noscript>\n <meta http-equiv='refresh' content='0; url={$url}'/>\n </noscript>\n "; } App::end(); }
/** * Контроллер или роут не найден, нужно ответить юзеру страницей 404. * * В конфиге должен быть прописан контроллер, который будет обрабатывать 404 ошибку. Если он не задан (пустая * строка), возвращаем 404-й заголовок и простой текст. * * Предохранитель для кодера: допустим, веб-сервер Apache и задан ErrorDocument. Но указанный адрес роутеру * неизвестен. Тогда роутер попытается ответить 404 (т.е. сюда попадет). А мы при этом реальный ответ веб-сервера * не подменяем и возвращаем текст по его коду. * * @throws ConfigException из parseHandler() */ private function notFound() { // Предохранитель $code = http_response_code(); if ($code > 400) { $msg = $code . ': ' . Response::textOf($code); if (isset($_SERVER['REDIRECT_URL'])) { $msg .= '<br>URL: ' . $_SERVER['REDIRECT_URL']; } Response::send($msg); App::end(); } http_response_code(404); if ($handler = App::conf('router.404_handler', false)) { list($controller, $action) = $this->parseHandler($handler); $controller->{$action}(); } else { Response::send('Неизвестный URL'); App::end(); } }