У меня есть класс маршрутизатора и есть несколько вопросов по построению ЧПУ, но сейчас не об этом. В настройке сервера я отправил все на index.php, и не могу вызвать стандартную ошибку 404, из маршрутизатора. Код (PHP): AddDefaultCharset utf-8 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?route=$1 [L,QSA] Помогите кто нибудь с .htaccess, а про ЧПУ спрошу по позже.
Мне кажется слишком сложное такое решение. К тому в будущем придётся обращаться из контроллера к маршрутизатору, что бы к примеру показать что site.ru/user/45/ не существует, а site.ru/user/46/ существует. Путаница какая то, и не нравиться жёсткая привязанность. А нельзя ли обойтись одним заголовком?
ты видимо чего-то не понимаешь, да? ну завернул ты все запросы на индекс.пхп. апачи будет передавать обработку всех урлов, для которых не удалось разрешить ресурс в физической файловой системе - пхп-машине. а та в свою очередь ему будет отвечать. и обычно она отвечает со статусом 200 и некоторым содержимым - страницей, скриптом, картинкой, видео и так далее. отдай статус не 200 а 301 или 302 - клиент отлетит по указанному адресу или обновит текущий ресурс. сопроводи статусом 4хх или 5хх и клиент поймет что случилась какая-то ошибка. так вот. лежит у тебя в файловой системе какая-то красивая страница для статуса 404 - в своем "роутере" её тупо прочитай в поток и всё. шаманить над рерайтером имеет смысл когда у тебя не один бэкэнд наверное.
Alex5646, в чём проблема-то? Код (PHP): if (invalid_request_uri()) { header("HTTP/1.0 404 Not Found"); die("You are stupid user. This URL is incorrect"); // На этом месте может быть любая вёрстка 404-й страницы }
Где то в Router->Start(): Код (PHP): // Не работает заголовок, стандартная ошибка не отображается header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found'); // Поэтому приходиться вызывать контроллер который мне на экране пишит "404 Not Found" $this->CallController('404'); А не работает потому что в .htaccess идет ридикет на index.php
А когда вы возвращаете заголовок 404, Error Document уже не работает, вы должны вместе с ошибкой вернуть и документ. Поэтому да, надо вызвать контроллер нужный.
емнип, не совсем так. если пришел заголовок со статусом но без тела - будет отработан стандартный документ. который, кстати, опять же емнип, не участвует в рерайтинге так как уже не относится к этапу разбора запроса. и это поведение удобно когда не один бэкэнд занимается формированием ответа. будь то пхп, перл, джава или еще что-нибудь - им будет достаточно возвращать просто статус 404 чтоб апачи показал одну единственную заданную конфигурацией страницу. а это и экономия трафика между апачи и бэкэндом, и работа со статикой, и экономия времени на том что не надо будет эту страницу программировать на разных япах.
У меня на локальном apache не так отработало: http://prntscr.com/9jtae0 Может настройка какая-то есть, я не знаю. Листинг 404.php Код (PHP): <?php header("HTTP/1.0 404 Not Found"); die; Или php всегда что-то вставляет в ответ
Первое сообщение .htaccess, у меня идёт редикет на index.php. А я бы хотел что бы всё шло на index.php кроме ошибок, что бы ошибки стандартные вырисовывало.
Где логика? Ты не знаешь что запрос ошибочный пока не обработал его в php. Надеюсь ты не собираешся явно перечислять все "неправильные" варианты адресов в .htaccess. Вместо того, чтобы хотеть странного от htaccess, лучше разберись что не так с твоим header(). Отлаживайся, ёмана!
Вызывать стандартные ошибки проще чем для всех назначать контроллеры. Мне apache хочет что то сказать а я не вижу ошибки потому что всё идёт на index. Вот тебе коды ошибок https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP Гораздо проще вызывать стандартные ошибки, а для популярных (404, 500) нарисовать контроллеры. А ещё лучше что бы работали header дабы сэкономить строку кода. Добавлено спустя 1 минуту 1 секунду: Это также как и для всех HTTP ошибок делать контроллеры)))
header-ы работают. Коды возвращаются в браузер. Но стандартное содержимое не подставляется, поскольку уже запущен php-скрипт. Может Ganzal тут сможет пролить свет, но мой эксперимент показал, что возврат пустого ответа с нужным заголовком не решает проблемы (которой, в принципе, и нету). Добавлено спустя 1 минуту 59 секунд: Кстати, по поводу htaccess. Этот htaccess не всё перенаправляет на index.php, а только то, для чего нету соответствующего файла, т.е. для тех урлов, которые в отсутствие этой инструкции давали бы 404-ю ошибку. Вот так-то
Alex5646, очень хочу ошибиться, но помоему ты вообще не понимашь о чем говоришь. давай вернемся к этому: сделай проверочку Код (Text): curl -i http://example.com/my-wrong-address или каким-нибудь другим доступным тебе способом посмотри что именно, включая заголовки, вернется в ответ на неправильный адрес. Добавлено спустя 7 минут 7 секунд: если по прежнему "ничего не работает", замени Код (PHP): $this->CallController('404'); на Код (PHP): die('лалала, я сошла с ума, какая досада'); упрощай и добивайся
Зачем? Ну и пишет мне 404, а с остальной сотней HTTP ошибок что делать, заголовак отсылается но я ведь не чего на экране не вижу. Стандартные ошибки хотя бы показывал, а вдруг что то случиться как я это пойму по белому экрану? Есть вариант прописать эти все ошибки в конроллерах как выше $this->CallController(контроллер, экшен, параметры);. Только вот чувствую можно это как то проще сделать без CallController.
Зачем его ставить если метод CallController работает? header не работает от него не кокого толка он не показыват ошибки! Я повторюсь HTTP ошибок около 100, если серьёзно для них делать контроллеры, то это псевдо прагромирование. Мне надо что бы тупо вызвал header и apache писал ошибку. Можно было бы написать в .htaccess php код я бы написал так: Код (PHP): AddDefaultCharset utf-8 RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d if(ОШИБКА) if(Есть контроллер) Вызываем else СТАНДАРТНАЯ СТРАНИЦА ОШИБКИ else RewriteRule ^(.*)$ index.php?route=$1 [L,QSA] К сожалению, это не когда не заработает(((
Фигасе ж себе, как страшно жить. Столько ошибок, просто глаза разбегаются! Вслед за мозгами. Добавлено спустя 2 минуты 8 секунд: Попробуй сосредоточиться на "страница не найдена". Сделай как я тебе подсказал без "зачем", ок?
Код (PHP): <?php header("HTTP/1.0 404 Not Found"); die; У меня белая страница. От себя добавлю - посылать заголовок в любом случае надо, чтобы поисковые боты не индексировали страницу. ЗЫ самому интересно как вывести дефолтную 404, если уже сработал рерайтер
Все может быть по разному у меня к примеру для каждоый страницы есть PageController к примеру имеем такую ссыль: http://mahmuzar/?cmd=test в .htaccess рерайт на Index.php в контроллере приложения Код (PHP): /** * Функция определяет какой страницы объект создавать. * если такой страницы не существует, возвращается обеъект страницы 404 * * @param \treto\controller\Request $request * @return PageController */ public function getPageController(\treto\controller\Request $request) { $cmd = $request->getParam("_get", "cmd"); var_dump($cmd); if (is_null($cmd)) { return new defaultp\DefaultPageController();//по умолчанию страница } $file = __NAMESPACE__ . "\\$cmd\\{$cmd}PageController.php"; if (file_exists($file)) { include $file; $class = __NAMESPACE__ . "\\$cmd\\{$cmd}PageController"; if (class_exists($class)) { return $class = new $class; } else { $request->setParam('_get', 'cmd', '404');//если такого класса не существует //так же можно реализовать класс NotFoundPageController и возвращать его объект //но я обошелся инклудом страницы 404. } } else { $request->setParam('_get', 'cmd', '404');//если файла класса не существует return $this;//возвращает объект PageController } }
Я знаю только что они года три ищут и не могут найти. Если бы это была HR-ная контора, или офшорные разработчики - было бы понятно зачем им этот затянувшийся квест. А для торгующих керам. плиткой как-то "необычно".