Перенаправление адреса заголовка Php не работает

Не знаю, почему это не работает. Вот код:

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    echo $_POST['cancel'];
}

Вместо перенаправления страницы этот вывод cancel на веб-страницу. Он пропустил перенаправление. Зачем? Как я могу это исправить? page1.php - это настоящая страница, расположенная в той же папке, что и текущая страница. Вышеупомянутый код - это первые строки файла php. Ничего раньше. Ничего. Даже пробелы.

Ответ 1

Пекка ответил на мой вопрос в комментариях. Он не отправил ответ, так что я сейчас. Используйте метод exit() после перенаправления заголовка. По какой-то причине остальная часть кода продолжает выполняться после перенаправления метода header(). Когда выполняется оставшаяся часть кода, на страницу выводится оператор эха. И вы не можете перенаправить использование функции заголовка после вывода на страницу. Чтобы избежать остальной части кода, используйте exit(). Спасибо Пекке.

ОБНОВЛЕНИЕ: при использовании браузера Internet Explorer я заметил, что $_POST ['cancel'] не является надежным. Я не совсем уверен, почему это так, но я подозреваю, что IE добавляет дополнительные переменные в форму submit, в частности, публикуется переменная "cancel". Я решил это, используя имя переменной, кроме "cancel". Сочетание использования exit() и имени уникальной переменной работает для меня.

Ответ 2

Вероятно, это проблема, вызванная отправкой заголовков.

Почему

Это происходит, если вы что-то повторили, прежде чем принимать решение о перенаправлении. Если это так, то начальные (по умолчанию) заголовки отправлены, и новые заголовки не могут заменить что-то, что уже в буфере вывода готово к отправке в браузер.

Иногда даже не нужно было что-то повторять:

  • Если ошибка выводится в браузер, она также считается содержимым, поэтому заголовки должны быть отправлены перед информацией об ошибке;
  • если один из ваших файлов закодирован в одном формате (скажем, ISO-8859-1), а другой закодирован в другом (скажем, UTF-8 с спецификацией), несовместимость между этими двумя кодировками может привести к тому, что несколько символов будут выводимый;

Пусть проверка

Чтобы проверить, если это так, вам необходимо включить отчет об ошибках: error_reporting(E_ALL); и установить отображаемые ошибки ini_set('display_errors', TRUE);, после чего вы, скорее всего, увидите предупреждение, ссылающееся на уже отправленные заголовки.

Пусть fix

Фиксация таких ошибок:

  • записывая логику перенаправления где-то в коде, прежде чем что-либо выйдет,
  • с использованием выходных буферов, чтобы уловить любую исходящую информацию и только отпустить ее в какой-то момент, когда вы знаете, что все попытки перенаправления были запущены;
  • Используя правильную структуру MVC, они уже решают ее;

Подробнее

MVC решает его как функционально, обеспечивая логику в контроллере, и контроллер запускает отображение/рендеринг представления только в конце контроллеров. Это означает, что вы можете решить сделать перенаправление где-нибудь внутри действия, но не с видом.

Ответ 3

Используйте @obstart или попробуйте использовать Java Script

поместите ваш obstart(); в верхнюю часть страницы

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

Если вы используете Javascript Использовать window.location.href

Пример window.location.href:

 if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
    {
        echo "<script type='text/javascript'>window.location.href = 'page1.php';</script>"
        exit();
    }

Ответ 4

Я уже сталкивался с такой проблемой, и теперь я больше не использую header('Location: pageExample.php');, вместо этого я использую javascript document.location.

Измените:

header('Location: page1.php');

Что-то вроде этого:

echo "<script type='text/javascript'> document.location = 'page1.php'; </script>";

И какова цель echo $_POST['cancel']; кстати?, просто удалите эту строку, если вы хотите только перенаправление. Я использую этот <script> каждый раз, и это не подводит меня.: -)

Ответ 5

У меня также была аналогичная проблема в ходьбе. Но после размещения ob_start(); в начале страницы php, откуда перенаправлялась страница, она работала нормально.

Пожалуйста, найдите пример исправления:

имя_файла: index.php

<?php
ob_start();
...
header('Location: page1.php');
...
ob_end_flush();
?>

Ответ 6

Для меня это тоже не сработало. Затем я пытаюсь использовать javascript внутри php, например

echo "<script type='text/javascript'>  window.location='index.php'; </script>";

Это определенно работает.

Ответ 7

Попробуйте добавить

ob_start();

в верхней части кода, то есть перед оператором include.

Ответ 8

Будьте очень осторожны с пробелами и другими вещами, которые могут повлиять на уже выполненный "вывод". Я, конечно, знаю это, но все еще страдал от одной и той же проблемы. Весь мой "Admin.php" файл имел несколько пробелов после закрытия php-тега? > Вниз в последней строке:)

Легко обнаруживается добавлением...

error_reporting(E_ALL);

... который рассказал мне, какая строка кода генерирует результат.

Ответ 9

У меня была схожая проблема... решаются путем добавления ob_start(); и ob_end_flush(); ...

<?php 
ob_start();


require 'engine/vishnuHTML.class.php';
require 'engine/admin/login.class.php';

$html=new vishnuHTML();
 (!isset($_SESSION))?session_start():"";

/* blah bla Code
...........
...........
 */

</div>
</div>
<?php
}



ob_end_flush();
?>

Подумайте о том, что ob_start() говорит: "Начните запоминать все, что обычно выводится, но пока ничего не делайте с ним".

ob_end_clean() или ob_flush(), который либо прекращает сохранять вещи, либо отбрасывает все, что было сохранено, либо останавливает сохранение и выводит все сразу, соответственно.

Ответ 10

Neer для указания кода выхода здесь, чтобы php не выполнялся дальше

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');        
    exit(0); // require to exit here 
}

Ответ 11

Попробуйте это, добавьте @ob_start() функцию вверху страницы,

if ((isset($_POST['cancel'])) && ($_POST['cancel'] == 'cancel'))
{
    header('Location: page1.php');
    exit();
}

Ответ 12

Используйте следующий код:   

if(isset($_SERVER['HTTPS']) == 'on')
{

    $self = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    ?>

     <script type='text/javascript'>
     window.location.href = 'http://<?php echo $self ?>';
     </script>"
     <?php

     exit();
}
?>

Ответ 13

Убедитесь, что вы не оставляете пробел перед <?php при запуске тега <?php в верхней части страницы.