我正在努力建立自己的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
还是有更好的方法?随意批评我到目前为止(它很少)。我会喜欢建议和想法。谢谢!
答案 0 :(得分:6)
MVC框架中的标准做法是使用output buffering(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 :(得分:1)
我不太擅长英语,但我会尝试;运行任何代码之前服务器上的404错误trigers(因为该页面不存在,因此没有代码)。
因此,如果您想在php代码中为用户提供404错误以寻找错误,则必须使用简单的重定向到404.html。
另一方面,如果您可以访问服务器配置文件,则可以在服务器上对其进行编程,而不是在其上运行的网页。你可以使用WAMP练习......
我希望你理解我。的CyaA
编辑我必须添加:
$ page = $ _GET ['page'];
如果没有设置$ _GET ['page'],这将给你一个错误,你必须在尝试使用之前检查isset($ _ GET ['page'])。
答案 2 :(得分:0)
您应该重定向或只是包含它,这里是修改后的代码:
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";
}
}