PHP, MVC, 404 - Как я могу перенаправить на 404? - PullRequest
3 голосов
/ 16 июня 2010

Я пытаюсь создать свой собственный MVC в качестве практики и опыта обучения. Пока что это то, что у меня есть (index.php):

<?php
require "config.php";

$page = $_GET['page'];
if( isset( $page ) ) { 
    if( file_exists( MVCROOT . "/$page.php" ) ) {
        include "$page.php";
    } else {
        header("HTTP/1.0 404 Not Found");
    }
}


?>

Моя проблема в том, что я не могу использовать заголовок для отправки на 404, потому что заголовки уже отправлены. Должен ли я просто перенаправить на 404.html или есть лучший способ? Не стесняйтесь критиковать то, что я имею до сих пор (это очень мало). Я хотел бы предложения и идеи. Спасибо!

Ответы [ 3 ]

6 голосов
/ 16 июня 2010

Стандартная практика в средах MVC состоит в использовании буферизации вывода (ob_start(), ob_get_contents() и ob_end_clean()) для управления тем, как, когда и что отправляется пользователю.

Таким образом, пока вы захватываете выходные данные вашей платформы, она не отправляется пользователю, пока вы не захотите.

Чтобы загрузить 404, вы должны использовать (например):

<?php
require "config.php";

$page = $_GET['page'];
ob_start();

if (isset($page)) {
    echo "isset is true";
    if (file_exists(MVCROOT."/$page.php")) {
        include MVCROOT."/$page.php";
        $output = ob_get_contents();
        ob_end_clean();
        echo $output;
    } else {
        ob_end_clean(); //we don't care what was there
        header("HTTP/1.0 404 Not Found");
        include MVCROOT."/error_404.php"; // or echo a message, etc, etc
    }
}
?>

Надеюсь, что поможет.

1 голос
/ 16 июня 2010

Я не очень хорош в английском, но я постараюсь; 404 триггеров ошибок на сервере перед запуском какого-либо кода (поскольку это означает, что страница не существует, поэтому нет кода).

Итак, если вы хотите дать пользователю ошибку 404 при поиске ошибки в коде php, вы должны использовать простое перенаправление на 404.html.

С другой стороны, если у вас есть доступ к файлам конфигурации сервера, вы можете запрограммировать это на сервере, а не на веб-странице, на которой он работает. Вы можете использовать WAMP для тренировки ...

Надеюсь, ты меня понимаешь. CyaA

РЕДАКТИРОВАТЬ я должен добавить:

$ page = $ _GET ['page'];

Это выдаст вам ошибку, если $ _GET ['page'] не установлен, вы ДОЛЖНЫ проверить его на isset ($ _ GET ['page']), прежде чем пытаться его использовать.

0 голосов
/ 16 июня 2010

Вы должны либо перенаправить, либо просто включить его, вот модифицированный код:

require "config.php";

$page = $_GET['page'];
if( isset( $page ) ) { 
    echo "isset is true";
    if( file_exists( MVCROOT . "/$page.php" ) ) {
        include  MVCROOT . "$page.php";
    } else {
        include  MVCROOT . "404.html";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...