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

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

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

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

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

Зачем

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

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

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

Давай проверим

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

Исправим

Исправление таких ошибок:

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

Больше

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

Используйте @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(); } 

Я уже сталкивался с такой проблемой, и теперь я не использую 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> каждый раз, и это не подводит меня. 🙂

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

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

fileName: index.php

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

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

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

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

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

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

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

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

 error_reporting(E_ALL); 

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

У меня была аналогичная проблема … решена путем добавления 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 (), которые либо перестают сохранять вещи, либо отбрасывают все, что было сохранено, либо останавливают сохранение и выводят все сразу, соответственно.

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

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

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

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

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

 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(); } ?> 

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

ob_start ();

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

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