PHPでエラー404を作成するにはどうすればよいですか?


111

私の.htaccessはすべてのリクエストを/word_hereにリダイレクトします/page.php?name=word_here。次に、PHPスクリプトは、要求されたページがページの配列に含まれているかどうかをチェックします。

そうでない場合、どうすればエラー404をシミュレートできますか?私はこれを試してみましたが、それは私を介して設定404ページには至らなかったErrorDocument.htaccess現れて。

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");

エラー404ページにリダイレクトするのは間違っていると思いますか?


なぜ機能しないのですか?サーバーの応答ヘッダーを確認しましたか?
ガンボ

1
結論の質問への回答として、はい、すべての404を実際のページにリダイレクトすることは悪い考えです。これは、存在すべきではないものを存在するものに変えることにより、HTTP仕様に違反します。
ルーカスオマーン

回答:


156

404ページを生成するための最新の回答(PHP 5.4以降)は次のように使用しますhttp_response_code

<?php
http_response_code(404);
include('my_404.php'); // provide your own HTML for the error page
die();

die() 厳密には必要ありませんが、通常の実行を継続しないようにします。


これをどのファイルに追加する必要がありますか?
Julfikar

87

あなたがしていることはうまくいき、ブラウザは404コードを受け取ります。それがしないことはあなたが期待しているかもしれない「見つかりません」ページを表示することです、例えば:

見つかりません

リクエストされたURL /test.phpがこのサーバーで見つかりませんでした。

これは、PHPが404コードを返すときにWebサーバーがそのページを送信しないためです(少なくともApacheは送信しません)。PHPは、独自の出力をすべて送信します。したがって、同様のページが必要な場合は、HTMLを自分で送信する必要があります。例:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found", true, 404);
include("notFound.php");
?>

これをhttpd.confに入れることにより、Apacheが独自の404メッセージに同じページを使用するように構成できます。

ErrorDocument 404 /notFound.php

ありがとう。私はそれが私の404ページを使用したと思いました。
Eric

上記のコードが使用される@JW?「.htaccess」ファイルのコードです。
Manohar Kumar

上記の@ManoharKumarコードは、404ページを送信する場所で使用します。私の場合、誰かがコードでアイテムを検索するときに使用しましたが、それは存在しません。だから私はそのアイテムが利用できないことを見つけた後に上記のコードを使用し、このコードの3行目でもexitを使用して、404ページ以降のロードを回避しました。JWさん、ありがとうございます。
Harsha 2016年

22

これを試して:

<?php
header("HTTP/1.0 404 Not Found");
?>

3
まあ、404はHTTP 1.0と1.1の両方で404です。1.0は安全な賭けです。クールな冗談BTW :) +1
Ates Goral

私の場合、header( "Location:HTTP / 1.0 404 Not Found");を指定する必要があります。
EasyLearn Academy、

9

.htaccessファイルを使用してカスタムエラーページを作成する

1. 404-ページが見つかりません

 RewriteEngine On
 ErrorDocument 404 /404.html

2. 500-内部サーバーエラー

RewriteEngine On
ErrorDocument 500 /500.html

3. 403-禁止

RewriteEngine On
ErrorDocument 403 /403.html

4. 400-不正なリクエスト

RewriteEngine On
ErrorDocument 400 /400.html

5. 401-承認が必要です

RewriteEngine On
ErrorDocument 401 /401.html

すべてのエラーを単一のページにリダイレクトすることもできます。お気に入り

RewriteEngine On
ErrorDocument 404 /404.html
ErrorDocument 500 /404.html
ErrorDocument 403 /404.html
ErrorDocument 400 /404.html
ErrorDocument 401 /401.html

RewriteEngineはこれとは何の関係もありません。その行を省略しても同じ結果が得られます。
WoodrowShigeru

3

ヘッダーを送信した後、die()を覚えていますか?404ヘッダーは自動的に処理を停止しないため、さらに処理が行われている場合は何も実行していないように見えることがあります。

404ページにリダイレクトするのはよくありませんが、そこからコンテンツを問題なく含めることができます。こうすることで、正しいURLから404ステータスを適切に送信するページができますが、「何を探しているのですか?」人間の読者のためのページ。


0

入れてみてください

ErrorDocument 404 /(root directory)/(error file) 

.htaccessファイル。

エラーに対してこれを行いますが、エラーの代わりに404を使用します。


0

DrupalまたはWordpress CMS(およびその他の可能性が高い)で、カスタムphpコードを存在させないようにしようとする場合(条件が満たされない限り)、CMSの404ハンドラーに引き継がせると、次のようにうまく機能します。

<?php
  if(condition){
    do stuff;
  } else {
    include('index.php');
  }
?>

-2

その行の直後に、exitまたはを使用して応答を閉じてみてくださいdie()

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
exit;

または

header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
die();

1
これを行うと、ユーザーには空のページが表示されます。私の質問は、で指定したのと同じ404ページをErrorDocumentPHP から送信する方法でした。
エリック

ErrorDocumentを使用する場合カスタムエラーファイルへのパスがサーバーの例のルートを基準にしていることを確認してください。仮想パスが/ folder1 / folder2 / myhtaccessであるとすると、サーバーのルートのエラードキュメントは次のようになります。 ErrorDocument 404 /folder1/folder2/my404.html
user5891645

ErrorDocumentPHPコードをすでに入力した後は、何の効果もありません。この回答は、私が9年前
Eric

あなたの問題が今までに解決されることを願っています。オフのテーマでは、?name = word_hereでリダイレクトしない方がいいと思います。代わりに、$reqpath = strtok("/".trim(substr($_SERVER["REQUEST_URI"], strlen(APP_ROOT)), "/"), "?");page.phpファイルで使用 してください。Cozは、それらのページの1つがユーザーからのクエリ「名前」を期待しているシナリオがあります。
user5891645

-2

これを一度試してください。

$wp_query->set_404();
status_header(404);
get_template_part('404'); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.