За последние 24 часа нас посетили 52472 программиста и 1726 роботов. Сейчас ищет 921 программист ...

Маршрутиризатор PHP

Тема в разделе "PHP для новичков", создана пользователем Alex5646, 29 дек 2015.

  1. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    У меня есть класс маршрутизатора и есть несколько вопросов по построению ЧПУ, но сейчас не об этом. В настройке сервера я отправил все на index.php, и не могу вызвать стандартную ошибку 404, из маршрутизатора.
    Код (PHP):
    1. AddDefaultCharset utf-8
    2.  
    3. RewriteEngine on 
    4.  
    5. RewriteCond %{REQUEST_FILENAME} !-f
    6. RewriteCond %{REQUEST_FILENAME} !-d
    7.  
    8. RewriteRule ^(.*)$ index.php?route=$1 [L,QSA] 
    Помогите кто нибудь с .htaccess, а про ЧПУ спрошу по позже.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    просто показать страницу, сопроводив её статусом 404
     
  3. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Мне кажется слишком сложное такое решение. К тому в будущем придётся обращаться из контроллера к маршрутизатору, что бы к примеру показать что site.ru/user/45/ не существует, а site.ru/user/46/ существует. Путаница какая то, и не нравиться жёсткая привязанность.

    А нельзя ли обойтись одним заголовком?
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты видимо чего-то не понимаешь, да? ну завернул ты все запросы на индекс.пхп. апачи будет передавать обработку всех урлов, для которых не удалось разрешить ресурс в физической файловой системе - пхп-машине. а та в свою очередь ему будет отвечать. и обычно она отвечает со статусом 200 и некоторым содержимым - страницей, скриптом, картинкой, видео и так далее. отдай статус не 200 а 301 или 302 - клиент отлетит по указанному адресу или обновит текущий ресурс. сопроводи статусом 4хх или 5хх и клиент поймет что случилась какая-то ошибка. так вот. лежит у тебя в файловой системе какая-то красивая страница для статуса 404 - в своем "роутере" её тупо прочитай в поток и всё. шаманить над рерайтером имеет смысл когда у тебя не один бэкэнд наверное.
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    покажи как ты пытаешся это сделать
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Alex5646, в чём проблема-то?
    Код (PHP):
    1. if (invalid_request_uri()) {
    2.      header("HTTP/1.0 404 Not Found");
    3.      die("You are stupid user. This URL is incorrect"); // На этом месте может быть любая вёрстка 404-й страницы
    4.      
    5. }
    6.  
     
  7. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Где то в Router->Start():
    Код (PHP):
    1. // Не работает заголовок, стандартная ошибка не отображается
    2. header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
    3. // Поэтому приходиться вызывать контроллер который мне на экране пишит "404 Not Found"
    4. $this->CallController('404');
    А не работает потому что в .htaccess идет ридикет на index.php
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А когда вы возвращаете заголовок 404, Error Document уже не работает, вы должны вместе с ошибкой вернуть и документ. Поэтому да, надо вызвать контроллер нужный.
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    емнип, не совсем так. если пришел заголовок со статусом но без тела - будет отработан стандартный документ. который, кстати, опять же емнип, не участвует в рерайтинге так как уже не относится к этапу разбора запроса. и это поведение удобно когда не один бэкэнд занимается формированием ответа. будь то пхп, перл, джава или еще что-нибудь - им будет достаточно возвращать просто статус 404 чтоб апачи показал одну единственную заданную конфигурацией страницу. а это и экономия трафика между апачи и бэкэндом, и работа со статикой, и экономия времени на том что не надо будет эту страницу программировать на разных япах.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    У меня на локальном apache не так отработало: http://prntscr.com/9jtae0 Может настройка какая-то есть, я не знаю. Листинг 404.php
    Код (PHP):
    1. <?php
    2. header("HTTP/1.0 404 Not Found");
    3.  
    Или php всегда что-то вставляет в ответ
     
  11. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Первое сообщение .htaccess, у меня идёт редикет на index.php. А я бы хотел что бы всё шло на index.php кроме ошибок, что бы ошибки стандартные вырисовывало.
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Где логика? Ты не знаешь что запрос ошибочный пока не обработал его в php. Надеюсь ты не собираешся явно перечислять все "неправильные" варианты адресов в .htaccess.

    Вместо того, чтобы хотеть странного от htaccess, лучше разберись что не так с твоим header(). Отлаживайся, ёмана!
     
  13. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Вызывать стандартные ошибки проще чем для всех назначать контроллеры. Мне apache хочет что то сказать а я не вижу ошибки потому что всё идёт на index. Вот тебе коды ошибок https://ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP

    Гораздо проще вызывать стандартные ошибки, а для популярных (404, 500) нарисовать контроллеры. А ещё лучше что бы работали header дабы сэкономить строку кода.

    Добавлено спустя 1 минуту 1 секунду:
    Это также как и для всех HTTP ошибок делать контроллеры)))
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    header-ы работают. Коды возвращаются в браузер. Но стандартное содержимое не подставляется, поскольку уже запущен php-скрипт. Может Ganzal тут сможет пролить свет, но мой эксперимент показал, что возврат пустого ответа с нужным заголовком не решает проблемы (которой, в принципе, и нету).

    Добавлено спустя 1 минуту 59 секунд:
    Кстати, по поводу htaccess. Этот htaccess не всё перенаправляет на index.php, а только то, для чего нету соответствующего файла, т.е. для тех урлов, которые в отсутствие этой инструкции давали бы 404-ю ошибку. Вот так-то :)
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Alex5646, очень хочу ошибиться, но помоему ты вообще не понимашь о чем говоришь.
    давай вернемся к этому:
    сделай проверочку
    Код (Text):
    1. curl -i http://example.com/my-wrong-address
    или каким-нибудь другим доступным тебе способом посмотри что именно, включая заголовки, вернется в ответ на неправильный адрес.

    Добавлено спустя 7 минут 7 секунд:
    если по прежнему "ничего не работает", замени
    Код (PHP):
    1. $this->CallController('404');
    на
    Код (PHP):
    1. die('лалала, я сошла с ума, какая досада');
    упрощай и добивайся
     
  16. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Зачем? Ну и пишет мне 404, а с остальной сотней HTTP ошибок что делать, заголовак отсылается но я ведь не чего на экране не вижу. Стандартные ошибки хотя бы показывал, а вдруг что то случиться как я это пойму по белому экрану?

    Есть вариант прописать эти все ошибки в конроллерах как выше $this->CallController(контроллер, экшен, параметры);. Только вот чувствую можно это как то проще сделать без CallController.
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    что ты выведешь, то и покажется.
    следуй инструкции — поставь die. кури.
     
  18. Alex5646

    Alex5646 Новичок

    С нами с:
    29 дек 2015
    Сообщения:
    277
    Симпатии:
    4
    Адрес:
    От верлюда
    Зачем его ставить если метод CallController работает? header не работает от него не кокого толка он не показыват ошибки! Я повторюсь HTTP ошибок около 100, если серьёзно для них делать контроллеры, то это псевдо прагромирование. Мне надо что бы тупо вызвал header и apache писал ошибку. Можно было бы написать в .htaccess php код я бы написал так:
    Код (PHP):
    1. AddDefaultCharset utf-8
    2.  
    3. RewriteEngine on 
    4.  
    5. RewriteCond %{REQUEST_FILENAME} !-f
    6. RewriteCond %{REQUEST_FILENAME} !-d
    7.  
    8. if(ОШИБКА) 
    9.     if(Есть контроллер) 
    10.         Вызываем
    11.     else
    12.         СТАНДАРТНАЯ СТРАНИЦА ОШИБКИ
    13. else
    14.     RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]  
    К сожалению, это не когда не заработает(((
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Фигасе ж себе, как страшно жить. Столько ошибок, просто глаза разбегаются! Вслед за мозгами.

    Добавлено спустя 2 минуты 8 секунд:
    Попробуй сосредоточиться на "страница не найдена". Сделай как я тебе подсказал без "зачем", ок?
     
  20. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Код (PHP):
    1. <?php
    2. header("HTTP/1.0 404 Not Found");
    3.   
    У меня белая страница.
    От себя добавлю - посылать заголовок в любом случае надо, чтобы поисковые боты не индексировали страницу.
    ЗЫ самому интересно как вывести дефолтную 404, если уже сработал рерайтер
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    а что ты сделал, чтобы она не была белой?

    Код (PHP):
    1. die('лалала, я сошла с ума, какая досада');
     
  22. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Все может быть по разному у меня к примеру для каждоый страницы есть PageController
    к примеру имеем такую ссыль: http://mahmuzar/?cmd=test
    в .htaccess рерайт на Index.php
    в контроллере приложения
    Код (PHP):
    1.   /**
    2.      * Функция определяет какой страницы  объект создавать.
    3.      * если такой страницы не существует, возвращается обеъект страницы 404
    4.      * 
    5.      * @param \treto\controller\Request $request
    6.      * @return PageController
    7.      */
    8.     public function getPageController(\treto\controller\Request $request) {
    9.         $cmd = $request->getParam("_get", "cmd");
    10.         var_dump($cmd);
    11.         if (is_null($cmd)) {
    12.             return new defaultp\DefaultPageController();//по умолчанию страница
    13.         }
    14.  
    15.         $file = __NAMESPACE__ . "\\$cmd\\{$cmd}PageController.php";
    16.         if (file_exists($file)) {
    17.             include $file;
    18.             $class = __NAMESPACE__ . "\\$cmd\\{$cmd}PageController";
    19.             if (class_exists($class)) {
    20.                 return $class = new $class;
    21.             } else {
    22.                 $request->setParam('_get', 'cmd', '404');//если такого класса не существует
    23.                 //так же можно реализовать класс NotFoundPageController и возвращать его объект
    24.                 //но я обошелся инклудом страницы 404.
    25.             }
    26.         } else {
    27.             $request->setParam('_get', 'cmd', '404');//если файла класса не существует
    28.             return $this;//возвращает объект PageController
    29.         }
    30.     }
    31.  
     
  23. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    mahmuzar, вижу ты поучаствовал в развлекухе "фирме Трето нужен веб-программист" )))
     
  24. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    artoodetoo, я вот делаю их галерею))
    А что, наепалово?
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Я знаю только что они года три ищут и не могут найти. :D Если бы это была HR-ная контора, или офшорные разработчики - было бы понятно зачем им этот затянувшийся квест. А для торгующих керам. плиткой как-то "необычно".