最近,我将WIP网站从带有WAMP的Windows XP计算机移动到带有MAMP的MacBook。当我测试网站时,我发现重定向(即$this->redirect="Index.php";
)似乎不起作用。它们在Windows XP机器上运行良好。
我使用前控制器模式。索引页面如下所示:
Index.php:
<?php
.....
switch ($action){
case 'logoff':
require_once('Controller_Logoff.php');
$command=new controller_Logoff();
break;
case 'register':
require_once('Controller_Register.php');
$command=new controller_Register();
break;
...
}
...
$command->execute($view);
$menu=array(
new MenuEntry("Logoff","Index.php",array("action"=>"logoff")),
new MenuEntry("Register","Index.php", array("action"=>"register")),
....
) // This menu is shown on the user's view
if ($command->getRedirect()){ //This case doesn't work
header('Location:'.$command->getRedirect());
}else if ($command->getInclusion()){ //This case works
include ("UI_Header.php");
include ("UI_Menu.php");
include ("UI_Message.php");
echo "<div class='content'>";
include ($command->getInclusion());
echo "</div>";
include ("UI_Footer.php");
}
问题似乎发生在这个阶段:header('Location:'.$command->getRedirect());
请注意,如果我header('Location: http://localhost:8888/'.$command->getRedirect());
,它仍然会失败。
我还尝试在我的脚本中包含ob_start();
,但没有效果。
其中一个控制器页面上的示例(在新用户注册结束时)我有:
Controller_register.php:
<?php
class Controller_Register extends Controller {
protected $inclusion='UI_Register.php';
function execute($view){
.... // Code to register a new user - that works, i.e., a new user appears in the DB
var_dump("Before redirect");
$this->redirect="Index.php";
var_dump("after redirect");
}
redirect
是用于各种控制器的类中的变量。它在父类中设置为null
。我已经确认在执行标题时它已更改为正确的值(Index.php
)。
当我运行此代码时,我得到一个空白页面。确切的事件过程是:
http://localhost:8888/Project/
register
,将我发送到注册页面,该网址为http://localhost:8888/Project/Index.php?action=register
submit
- 信息已成功加载到数据库中。http://localhost:8888/Project/Index.php?action=register
,但显然文件(注册页面)未加载。从我开始点击register
链接时的错误日志产生以下内容:
答案 0 :(得分:3)
output started at /Applications/MAMP/htdocs/Project/Index.php:1)
从Index.php或<?php
答案 1 :(得分:2)
我假设您分享的代码仅显示您估计相关的部分;基于此,我要做的一件事就是在发送exit
后添加header
,这样您就可以确定在以下情况之后不会执行任何代码:
...
if ($command->getRedirect()) { //This case doesn't work
header('Location:'.$command->getRedirect());
exit;
} else if ...
答案 2 :(得分:0)
var_dump("Before redirect");
$this->redirect="Index.php";
var_dump("after redirect");
这是导致重定向失败的原因。 var转储输出到浏览器,防止重定向发生。尝试评论vardump并查看是否可以使其正常工作。
我还尝试包含ob_start();在我的剧本中,没有任何效果。
这也应该有用,但要确保在运行上述代码之前包含它。