Заголовок PHP ("Местоположение: /404.php ", правда, 404) не работает


Я хотел бы использовать следующее для перенаправления страниц, которых больше нет в базе данных, на пользовательскую страницу 404:

ob_start();
....
if ( !$found ):
  header( "Location: /404.php", true, 404 );
  exit();
endif;

Но на самом деле это не перенаправляет, а просто показывает пустую страницу (из-за вызова exit() перед любым выводом в браузер).

Я также пробовал следующее:

if ( !$found ):
  header( "HTTP/1.1 404 Not Found" );
  exit();
endif;

С 'Ошибочным документом 404/404.php "в моем файле.htaccess, но это также просто показывает пустую страницу.

И если я сделаю это:

if ( !$found ):
  header( "HTTP/1.1 404 Not Found" );
  header( "Location: /404.php" );
  exit();
endif;

Он перенаправляет, но с заголовком 302.

Любая помощь будет весьма признательна.

Author: Vivienne, 2011-05-26

5 answers

Может быть, без перенаправления?

if ( !$found ):
   include('../404.php');
   exit();
endif;
 -7
Author: Danzan, 2011-05-26 17:01:06

Я знаю, что это старая проблема, но я просто нашел ее удобной:

Php установил заголовок состояния на 404 и добавил обновление для исправления страницы, например, через 2 секунды после.

header('HTTP/1.1 404 Not Found');
header("Refresh:0; url=search.php");

Затем у вас появляется страница 404 за несколько секунд до перенаправления на страницу поиска fx.

В моем случае Symfony2, за исключением слушателя:

$request  = $event->getRequest();
$hostname = $request->getSchemeAndHttpHost();
$response->setStatusCode(404);
$response->setContent('<html>404, page not found</html>');
$response->headers->set('Refresh', '2;url='.$hostname.'/#!/404');

Время (2) может быть 0,2, если вы хотите очень короткое время.

 9
Author: Jacob Christensen, 2015-08-17 13:04:08

У вас не может быть заголовка 404 с местоположением:

Вы должны отобразить страницу с ошибкой и установить meta refresh с новым URL-адресом, если вы хотите перенаправить

 6
Author: dynamic, 2011-05-26 16:59:18

Я пробовал и обязательно проверял файл error_log, правильный способ - отправить 404 заголовка, а затем включить страницу ошибки в следующую строку.

<?php
header('HTTP/1.1 404 Not Found');
include 'search.php'; // or 404.php whatever you want...
exit();
?>

Наконец, вы должны использовать exit() для текстовых браузеров.

 4
Author: Aydın Antmen, 2014-03-19 22:15:48

Я думаю, что ваша проблема связана с буферизацией вывода, которую вы запускаете, или потому, что вы не можете перенаправить с помощью 404. В первом примере кода показан запуск выходного буфера, но выход вместо очистки выходного буфера и остановки буферизации вывода.

Измените первый пример на:

if (!$found) {
  ob_end_clean();
  header('Location: /404.php');
  exit();
}
 3
Author: Fosco, 2011-05-26 17:01:53