更改开发机器后PHP重定向无法正常工作

时间:2014-10-02 21:54:31

标签: php redirect mamp

最近,我将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)。

当我运行此代码时,我得到一个空白页面。确切的事件过程是:

  1. 打开网站 - 网址为http://localhost:8888/Project/
  2. 点击菜单项register,将我发送到注册页面,该网址为http://localhost:8888/Project/Index.php?action=register
  3. 在注册表单中输入所需信息(用户名,PW和电子邮件),然后单击submit - 信息已成功加载到数据库中。
  4. 显示空白页面 - 网址不会更改并保持http://localhost:8888/Project/Index.php?action=register,但显然文件(注册页面)未加载。
  5. 从我开始点击register链接时的错误日志产生以下内容:

    • [09-Oct-2014 23:10:00 Europe / Berlin] PHP警告:无法修改标头信息 - 已经发送的标头(输出从/Applications/MAMP/htdocs/Project/Index.php:1开始)第2行/Applications/MAMP/htdocs/Project/UI_Header.php
    • [09-Oct-2014 23:10:07 Europe / Berlin] PHP警告:session_start():无法发送会话缓存限制器 - 已发送的标头(输出从/Applications/MAMP/htdocs/Project/Index.php开始:1)在第13行的/Applications/MAMP/htdocs/Project/Index.php中

3 个答案:

答案 0 :(得分:3)

output started at /Applications/MAMP/htdocs/Project/Index.php:1)

从Index.php或<?php

前面的任何空格中删除BOM标记

http://en.wikipedia.org/wiki/Byte_order_mark

请阅读此内容 - https://stackoverflow.com/a/8028987/1164491

答案 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();在我的剧本中,没有任何效果。

这也应该有用,但要确保在运行上述代码之前包含它。