Перенаправление заголовка PHP не работает - PullRequest
10 голосов
/ 07 августа 2009

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

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

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 ]

19 голосов
/ 07 августа 2009

Попробуйте:

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 (), потому что вы непреднамеренно запрашиваете все ошибки, КРОМЕ сообщений и предупреждений… именно это и есть ошибка «заголовки уже отправлены».

Edit:

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

14 голосов
/ 07 августа 2009

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

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

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

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

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

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

13 голосов
/ 20 июня 2015

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

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

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

3) ПРАВИЛО ЗОЛОТА! - файл (и другие файлы include() -d) должен иметь UTF8 без кодировки BOM (а не только *) 1030 * UTF-8 ). Во многих случаях это является проблемой (потому что типичный UTF8 файл имеет специальный символ в начале вывода файла) !!!!!!!!!!!

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

5) Рекомендуемая практика - всегда используйте 301 или 302 в качестве ссылки:

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

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

echo "<script type='text/javascript'>window.top.location='http://example.com/';</script>"; exit;
4 голосов
/ 23 апреля 2012

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

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

1 голос
/ 27 апреля 2016

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

1 голос
/ 11 июня 2012

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

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

1 голос
/ 07 августа 2009

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

<?php
0 голосов
/ 20 марта 2018

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

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

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

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

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

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

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

0 голосов
/ 19 апреля 2017

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

<?php

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

?>
0 голосов
/ 01 апреля 2017

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

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

Вместо

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...