Проблема перенаправления страницы PHP - невозможно изменить информацию заголовка

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

Можете ли вы изменить первую часть кода страницы, показанную ниже, чтобы отправить 404 (или, по крайней мере, в projecterror.php, который имеет заголовки 404), если $id не существует? Большое спасибо!

<?php
include_once("includes/linkmysql.php");
$adda=$_GET['a']; 
$cont=$_GET['c']; 
$select="SELECT * FROM projects where id='$id'";
$qselect = mysql_query($select);
while ($row = mysql_fetch_array($qselect)) { 

Следующая модификация, любезно предложенная Matt Wilson в результате оригинального комментария Vivek Goel приводит к тому, что действительные записи показывают страницу правильно, но несуществующие страницы показывают ошибки ниже этого измененного кода:

<?php
include_once("includes/linkmysql.php");
$adda=$_GET['a']; 
$cont=$_GET['c']; 
$select="SELECT * FROM projects where id='$id'";
$qselect = mysql_query($select);
if( mysql_num_rows( $qselect ) === 0 )
{
   header("HTTP/1.1 301 Moved Permanently");
   header( 'Location: http://examplesite.domain/errorpage' ) ;
   exit;
}
while ($row = mysql_fetch_array($qselect)) { 

Ошибки, возникающие в результате вышеуказанных модификаций:

Warning: Cannot modify header information - headers already sent by (output started at /home/website/public_html/header1.php:14) in /home/website/public_html/header1.php on line 22 
Warning: Cannot modify header information - headers already sent by (output started at /home/website/public_html/header1.php:14) in /home/website/public_html/header1.php on line 23 Lines 22 and 23 are the two header lines in your example above

Строки 22 и 23 — это две строки заголовка, как показано ниже:

header("HTTP/1.1 301 Moved Permanently");
header( 'Location: http://examplesite.domain/errorpage' ) ;

person JoeW    schedule 07.08.2011    source источник


Ответы (3)


У меня есть гораздо более легкое решение для вас - это просто! Просто добавьте эту команду в самое начало исходного кода php:

ob_start();

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

person Tomas    schedule 08.08.2011
comment
Отличная работа - это сработало именно так, как я надеялся, большое спасибо! - person JoeW; 08.08.2011
comment
Работал отлично!. Спасибо! - person Sumith Harshan; 12.05.2013

перед отправкой какой-либо вещи на просмотр (текст в браузере). проверьте, действительна ли ваша модель, если идентификатор действителен или нет. если идентификатор недействителен, перенаправьте на страницу с ошибкой

header("HTTP/1.1 301 Moved Permanently");
header( 'Location: http://examplesite.domain/errorpage' ) ;
person Vivek Goel    schedule 07.08.2011
comment
вы отправляете текст перед размещением заголовка. это будет происходить перед отправкой любого представления. (любая вещь для браузера) - person Vivek Goel; 08.08.2011
comment
Хотя где текст? Я не могу это решить... - person JoeW; 08.08.2011
comment
это ваш полный код страницы? или частичный код - person Vivek Goel; 08.08.2011
comment
project.php — это главная страница, которая имеет это вверху (header1.php — это код, написанный выше): <?php $id=$_GET['id']; include_once("header1.php"); if (isset($_GET['id'])) $id=$_GET['id']; setprojectdetail($id,"views",projectattr($id,"views")+1); $det=projectdetail($id); date_default_timezone_set('CET'); ?> - person JoeW; 08.08.2011
comment
Думаю, include_once(header1.php); отправляет заголовок и данные. - person Vivek Goel; 08.08.2011
comment
Код от header1.php до того места, где мы закончили в первом посте, таков: <?php session_start(); include_once("includes/config.php"); include_once("includes/func.php"); include_once("includes/resetinfo.php"); include_once("includes/userinfo.php"); include_once("includes/projectinfo.php"); include_once("includes/contributioninfo.php"); include_once("includes/withdrawalinfo.php"); include_once("includes/cateinfo.php"); include_once("captcha/captcha.php"); ?> ...за которым следует код из первого поста здесь. - person JoeW; 08.08.2011
comment
сеанс_старт(); не следует вызывать, если это перенаправление 301. и вы уверены, что не отправляете какие-либо o/p в браузер из этих файлов? - person Vivek Goel; 08.08.2011
comment
Я просто попытался удалить все включенные файлы, кроме config.php, который необходим для пользователя/пароля базы данных и т. д. Я также удалил session_start(), который также не работал. Ошибка продолжает падать на строки заголовка 2x. - person JoeW; 08.08.2011
comment
есть гораздо более простое решение, см. мой ответ - person Tomas; 08.08.2011

Никакой контент не должен отправляться в браузер перед использованием перенаправления php header(). Вместо этого вы можете попробовать перенаправление javascript, если заголовки уже отправлены.

if( mysql_num_rows( $qselect ) === 0 )
{
   echo "<script type='text/javascript'>window.location.href='{http://examplesite.domain/errorpage}'</script>";
   exit;
}

Но я не уверен, что перенаправления javascript удобны для поисковых систем.

person Withfriendship Hiox    schedule 31.01.2012