Ответ 1
Может быть, без перенаправления?
if ( !$found ):
include('../404.php');
exit();
endif;
Я хотел бы использовать следующее для перенаправления страниц, которые больше не присутствуют в базе данных на пользовательской странице 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.
Любая помощь будет принята с благодарностью.
Может быть, без перенаправления?
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();
}