Перенаправление заголовка PHP не работает

Я знаю, что это было покрыто раньше, но я не могу найти ответа на это,

Я всегда использовал это:

header("Location: http://www.website.com/");
exit();

это всегда работало в моем текущем проекте, и внезапно он не работает ни в одном из моих браузеров

Я хотел бы выяснить проблему и исправить ее, вместо использования

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>";

у меня также включена отчетность об ошибках, и она не показывает ошибок

// SET ERROR REPORTING
error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE);
ini_set('display_errors', TRUE);

любые идеи, почему это не будет работа?

13 ответов


попробуй:

error_reporting(E_ALL | E_WARNING | E_NOTICE);
ini_set('display_errors', TRUE);


flush();
header("Location: http://www.website.com/");
die('should have redirected by now');

посмотрите, что вы получите. Вы не должны использовать ^ (xor) в вызове error_reporting (), потому что вы непреднамеренно запрашиваете все ошибки, кроме уведомлений и предупреждений.. что заголовки уже отправлены ошибки.

изменить:

также попробуйте поместить flush() прямо над вашим вызовом header ().


Попробуйте удалить пространство между местоположением и первым h в http.

header("Location: http://www.website.com/");
exit();

превращается в

header("Location:http://www.website.com/");
exit();

у меня была эта проблема на моем сервере WAMP.

хотя это не должно быть проблемой, учитывая, что это описано в документации PHP. Но тебе все равно стоит попробовать. Я знаю, что это сработало для меня в ряде случаев.


ОБЩИЕ ПРОБЛЕМЫ:

1) не должно быть никакого вывода (т. е. echo.. или HTML-коды) перед header(.......);.

2) не должно быть пробел(или newline) до <?php и после ?> теги.

3) ПРАВИЛО ГОЛДЕРА! - файла (а также, если вы include другие файлы) есть в utf8 без BOM кодировка (и не только UTF-8). Это проблема во многих случаях (потому что utf8 в закодированный файл имеет что-то особенное в начале вывода файла)!!!!!!!!!!!

4) включить отчет об ошибках. И скажи об ошибке.

5) если перенаправление, то после header(...); вы должны использовать exit;

6) всегда используйте 301 или 302 внутри ссылка:

header("location: http://example.com",  true,  301 );  exit;

7) если ничего из вышеперечисленного не помогает, используйте перенаправление JAVSCRIPT (не рекомендуется Google), но это может быть последний шанс...:

echo "<script type='text/javascript'>window.top.location='http://example.com/';</script>"; exit;

попробуйте это. работать на меня.

echo "<meta http-equiv='refresh' content='0;url=http://www.yoursite.com'>";


также, Когда вы используете функцию заголовка, она должна быть первой, вызванной до того, как любой текст (даже пробел) будет записан клиенту, поэтому проверьте еще раз, что нет никаких пробелов, выводимых до вашего вызова даже до th

<?php

Это может быть странное решение, но попробуйте это, измените кодировку страницы с utf8 на ANSI, и она будет работать.

используйте любой текстовый редактор и сохраните страницу как кодировку ANSI и загрузите ее на свой онлайн-сервер.


добавление ob_start () решило эту проблему.


что именно происходит, когда вы посещаете эту страницу? Вы можете попробовать Firebug или любой другой инструмент, который позволяет анализировать HTTP-заголовки и проверять, действительно ли происходит перенаправление и Location заголовок действительно присутствует.


вы также должны убедиться, что вы перенаправляете в допустимое место и что место имеет правильные 404 и 500 сообщений об ошибках/страниц. Может быть, вы просто перенаправляете плохое место.


странно, но удаление пустых строк в php сработало для меня : -\

код перед:

<?php

header("Location: http://www.website.com/");

?>

код, который работает:

<?php header("Location: http://www.website.com/"); ?>

попробуйте это (работает для меня):

echo '<script>window.location.replace("http://www.example.com")</script>';

вместо

header("Location: http://www.example.com");


Если ваша индексная страница является html-файлом, она может не работать. Измените его на index.php и используйте этот код:

<?php

header("Location: http://ea.tc");

?>

у меня на самом деле был случай, подобный этому, когда у меня была страница администратора, которая была включена в верхней части всех моих других страниц. В верхней части каждой страницы под строкой:

<?php include '../../admin.php' ?>

у меня была бы логика php:

<?php if($_SESSION['username'] === null){ header("Location: ./adminLogin.php");}?>

проблема с этим было то, что где-то еще я также позвонил/манипулирование header(.... После долгого времени, проходящего через мой код, я признаю, что не мог понять, в чем проблема. Тогда я подумал, что каждый из этих файлов попадает в мой admin.php файл, прежде чем делать что-либо еще. Поэтому я подумал о том, что произойдет, если я помещу логику, которая была в верхней части каждого из моих представлений (потому что я не хотел, чтобы что-либо было видно, если вы не вошли в систему) в my ?

случилось так, что, прежде чем он даже попал в любой из php / html в моих представлениях, он оценил, был ли кто-то зарегистрирован ($_SESSION['username'])) и если бы это было NULL затем я просто перенаправлен на страницу adminLogin. Я ставлю эту логику прямо перед моим переключателем. и он отлично работал для всех моих файлов, которые когда-то требовали логики. Как я работал в разработке, но создает много проблем в производстве. Я обнаружил, что перемещение логики перенаправления на my admin.php файл не только избежал дублирования header(... манипуляция, но на самом деле сделала мой код более эффективным, удалив лишнюю логику из моих файлов просмотра и в мой .

вместо того, чтобы помещать логику в каждый файл представления, поместите его в свой контроллер один раз, прежде чем переключатель. Работает как шарм! Это полезно, если вы не хотите, чтобы кто-либо получал доступ к конфиденциальным представлениям, если они не входят в систему. В моем случае это было важно для моей CMS. Однако, если есть некоторые файлы, которые вы хотите просмотреть без входа в систему, я думаю, что оригинальной логики будет достаточно. Похоже, вы уже нашли решение, но, надеюсь, это может быть полезно, если вы снова столкнетесь с этой ошибкой. :)