web-dev-qa-db-ja.com

PHP header( "Location:/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;

.htaccessファイルに「ErrorDocument404/404.php」が含まれていますが、これも空のページを示しています。

そして私がこれを行う場合:

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

リダイレクトしますが、302ヘッダーを使用します。

どんな助けでも大歓迎です。

13
Vivienne

私はそれが古い問題であることを知っていますが、私はそれが便利だと思っただけです:

phpはステータスヘッダーを404に設定し、2秒後のように正しいページに更新を追加します。

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

次に、fx検索ページにリダイレクトする数秒前に404ページが表示されます。

私の場合、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にすることができます。

10

場所を持つヘッダー404を持つことはできません:

リダイレクトする場合は、エラーページを表示し、新しいURLでmeta refreshを設定する必要があります

8
dynamic

404ヘッダーを送信してから、エラーページを次の行に含めるという正しい方法であるerror_logファイルを確認してみました。

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

最後に、テキストベースのブラウザにはexit()を使用する必要があります。

4
Aydın Antmen

問題は、開始している出力バッファリング、または404でリダイレクトできないことが原因だと思います。最初のコード例は、出力バッファをクリーンアップして出力バッファリングを停止する代わりに、出力バッファを開始して終了することを示しています。

最初の例を次のように変更します。

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