Перенаправление адреса заголовка 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
в верхней части страницы.