Заголовок PHP («Location: /404.php», true, 404) не работает - PullRequest
13 голосов
/ 26 мая 2011

Я хотел бы использовать следующее для перенаправления страниц, которых больше нет в базе данных, на пользовательскую страницу 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.

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

Ответы [ 5 ]

9 голосов
/ 17 августа 2015

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

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

7 голосов
/ 26 мая 2011

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

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

4 голосов
/ 20 марта 2014

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

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

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

3 голосов
/ 26 мая 2011

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

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

if (!$found) {
  ob_end_clean();
  header('Location: /404.php');
  exit();
}
0 голосов
/ 26 мая 2011

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

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