PHP редирект не работает после смены машины разработки

Недавно я переместил свой WIP-сайт с компьютера с Windows XP с WAMP на MacBook с MAMP. Когда я тестирую сайт, я обнаруживаю, что перенаправления (то есть, $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. Откройте сайт — URL есть http://localhost:8888/Project/
  2. Нажмите на пункт меню register который отправляет меня на страницу регистрации, который URL http://localhost:8888/Project/Index.php?action=register
  3. Введите необходимую информацию (имя пользователя, адрес электронной почты и адрес электронной почты) в форму регистрации и нажмите submit — информация успешно загружена в БД.
  4. Показана пустая страница — URL не меняется и остается http://localhost:8888/Project/Index.php?action=register но очевидно файл (страница регистрации) не загружен.

Журнал ошибок с момента, когда я начинаю нажимать на register ссылка дает следующее:

  • [09-Oct-2014 23:10:00 Europe / Berlin] PHP Предупреждение: невозможно изменить информацию заголовка — заголовки уже отправлены (вывод начался с /Applications/MAMP/htdocs/Project/Index.php:1) в / Applications / MAMP / htdocs / Project / UI_Header.php в строке 2
  • [09-Oct-2014 23:10:07 Европа / Берлин] PHP Предупреждение: session_start (): невозможно отправить ограничитель кэша сеанса — заголовки уже отправлены (вывод начался с /Applications/MAMP/htdocs/Project/Index.php:1) в /Applications/MAMP/htdocs/Project/Index.php в строке 13

-2

Решение

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

Удалите метку спецификации из Index.php или любое пространство перед <?php

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

И прочитайте это, пожалуйста — https://stackoverflow.com/a/8028987/1164491

3

Другие решения

Я предполагаю, что код, которым вы поделились, показывает только те части, которые вы считаете релевантными; и основываясь на этом, что я хотел бы сделать, это добавить exit после отправки header так что вы уверены, что после:

...
if ($command->getRedirect()) { //This case doesn't work
header('Location:'.$command->getRedirect());
exit;
} else if ...
2

var_dump("Before redirect");
$this->redirect="Index.php";
var_dump("after redirect");

Это то, что вызывает сбой перенаправления. Дампы var выводятся в браузер, предотвращая перенаправление. Попробуйте закомментировать vardumps и посмотрите, работает ли он.

Я также попытался включить ob_start (); в моем сценарии безрезультатно.

Это тоже должно работать, но убедитесь, что это включено до запуска приведенного выше кода.

0
По вопросам рекламы [email protected]