Заголовок 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.
Любая помощь будет весьма признательна.
5 answers
Может быть, без перенаправления?
if ( !$found ):
include('../404.php');
exit();
endif;
Я знаю, что это старая проблема, но я просто нашел ее удобной:
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, если вы хотите очень короткое время.
У вас не может быть заголовка 404 с местоположением:
Вы должны отобразить страницу с ошибкой и установить meta refresh
с новым URL-адресом, если вы хотите перенаправить
Я пробовал и обязательно проверял файл error_log, правильный способ - отправить 404 заголовка, а затем включить страницу ошибки в следующую строку.
<?php
header('HTTP/1.1 404 Not Found');
include 'search.php'; // or 404.php whatever you want...
exit();
?>
Наконец, вы должны использовать exit() для текстовых браузеров.
Я думаю, что ваша проблема связана с буферизацией вывода, которую вы запускаете, или потому, что вы не можете перенаправить с помощью 404. В первом примере кода показан запуск выходного буфера, но выход вместо очистки выходного буфера и остановки буферизации вывода.
Измените первый пример на:
if (!$found) {
ob_end_clean();
header('Location: /404.php');
exit();
}