Заголовок PHP ( "Местоположение:/404.php", true, 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;

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

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

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

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

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

Ответы

Ответ 1

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

if ( !$found ):
   include('../404.php');
   exit();
endif;

Ответ 2

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

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, если вы хотите очень короткое время.

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

if (!$found) {
  ob_end_clean();
  header('Location: /404.php');
  exit();
}