PHPアプリが404エラーを送信しないのはなぜですか?


140
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
}

なぜこれが機能しないのですか?空白のページが表示されます。


1
404ステータスを送信し、カスタム404ページをすぐに含めることをお勧めします。それが私がかつてやったことです。
ロッキー

私のPHPサーバーでは完全に動作します。上記の行は、サーバーのデフォルトの404ページを返します。これはサーバーで設定できると思います。
Elmue 2014年

回答:


306

あなたのコードは技術的に正しいです。その空白ページのヘッダーを見ると、404ヘッダーが表示され、他のコンピューター/プログラムは、ファイルが見つからないとして応答を正しく識別することができます。

もちろん、ユーザーはまだSOLです。通常、404はWebサーバーによって処理されます。

  • ユーザー:ねえ、このURIウェブサーバーで何か私に何かありますか?
  • ウェブサーバー:いいえ、ありません。404!これが404について表示するページです。

問題は、WebサーバーがPHPページの処理を開始すると、404ページを処理するポイントをすでに通過していることです。

  • ユーザー:ねえ、このURIウェブサーバーで何か私に何かありますか?
  • ウェブサーバー:はい、そうです、それはPHPページです。応答コードが何であるかを教えてくれます
  • PHP:こんにちは、OMG 404 !!!!!!!
  • ウェブサーバー:ばかげている、404ページの人々はすでに家に帰っていたので、PHPがくれたものを送ってやる

PHPは、404ヘッダーを提供するだけでなく、実際の404ページを出力する役割も果たします。


49
14歳の女の子であろうとなかろうと、ちょっとした安っぽい会話は、私にとってこれを意味のあるものにしてくれました。
rbwhitaker

20
PHP 14当時
アダム・リンチ

1
スタックオーバーフローは、スタイルのために機能を+1に追加する必要があります。これはすべての+1を取得します。
Jay Querido、2013

30
これがドキュメントの書き方です!特に私が本当に嫌うApacheのドキュメント:)
Harry

4
流血が見事に説明されました!私の日を作りました!
Andrei Cristian Prodan 2014

78
if (strstr($_SERVER['REQUEST_URI'],'index.php')){
    header('HTTP/1.0 404 Not Found');
    echo "<h1>404 Not Found</h1>";
    echo "The page that you have requested could not be found.";
    exit();
}

最後の2つのエコー行を見ると、そこにコンテンツが表示されます。好きなようにカスタマイズできます。


74

これは正しい動作です。404ページのコンテンツを作成するのはあなた次第です。
404ヘッダーは、ファイルが存在するかどうかを判断するためにスパイダーとダウンロードマネージャーによって使用されます。
(404ヘッダーのあるページは、Googleや他の検索エンジンによってインデックスに登録されません)

ただし、通常のユーザーはhttp-headersを参照せず、そのページを通常のページとして使用します。


20
FWIW、404の場合、IEはコンテンツが短い場合、標準の「見つかりません」ページを返します(サーバーが「見つかりません」とだけ言っていると想定し、ユーザーにより良いページを表示することを決定します)。
Serge Wautier、2011

16

記録のために、これはすべての場合のハンドラです:

<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->


いいえ、それらをファイルの先頭に配置して、カスタム404ページに進みます。
Silviu-Marian 2014

14

たとえば、apacheに定義されている場合は、デフォルトのサーバー404ページをロードします。

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}

その動作せず、表示警告:readfile(404missing.html):ストリームを開けませんでした:/var/www/.com/public_html/index1.phpの61行目のそのようなファイルまたはディレクトリはありません

2
@AMB自分でファイルを作成する必要があるからです。
スーパーキャット

@SuperCatのおかげで、今私は、エラーを再読み込みし、すべてが今明らかである、。


4

@Kitetに基づく別のソリューション。

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

$_SERVER['REDIRECT_STATUS'] = 404;
//If you don't know which web page is in use, use any page that doesn't exists
$handle = curl_init('http://'. $_SERVER["HTTP_HOST"] .'/404missing.html');
curl_exec($handle);

制御できないサーバーでホストされているWebサイトをプログラミングしている場合、どのファイルが「404missing.html」であるかはわかりません。ただし、これは可能です。

このようにして、同じサーバー上の通常の404ページとまったく同じ結果を提供しました。オブザーバーは、既存のPHPページが返す404と存在しないページを区別できません。


4

試してください:

header("Status: 404 Not Found");
header('HTTP/1.0 404 Not Found');

バイバイ!


2

少し短いバージョン。奇数のエコーを抑制します。

if (strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  exit("<h1>404 Not Found</h1>\nThe page that you have requested could not be found.");
}

2
if($_SERVER['PHP_SELF'] == '/index.php'){ 
   header('HTTP/1.0 404 Not Found');
   echo "<h1>404 Not Found</h1>";
   echo "The page that you have requested could not be found.";
   die;
}

echoステートメントを単純化せず、上記のセミコロンを忘れないでください。また、ページでsubstrを実行する理由は、php_selfを簡単に実行することだけです。


2
REQUEST_URIはPHP_SELFと同じではないためです。特にURLの書き換えがある場合。
Timo Huovinen、2011年

1

サーバーのデフォルトのエラーページを表示したい場合は、サーバーでこれを処理する必要があります。


1

それはいくつかの精製を使用する可能性がありますが、あなたはそれを正しくやっています。それは解決されたようですので、実際のアプリケーションの利点について話しましょう:

多言語の技術ドキュメントの大規模なコレクションを持っている私たちの古いウェブサイトは、if else条件内でこれを実行していました:

    if (<no file found>){
        die("NO FILE HERE");
    }

問題(役に立たないメッセージとユーザーエクスペリエンスの悪さのほか)は、通常、リンククローラー(この場合は整合性)を使用して、不適切なリンクと不足しているドキュメントをチェックすることです。これは、そこにファイルがあったことを知らせる完全に正しい200エラーなしの応答が得られたことを意味します。Integrityは、PDFが必要であることを認識していなかったため、phpを使用して手動で404ヘッダーを追加する必要がありました。ダイの上にコードを追加すると(その後は何も実行されず、ヘッダーは常にレンダリングされたhtmlの前にあるはずなので)、整合性(ブラウザの動作とほぼ同じです)は404を返し、欠落している箇所を正確に知ることができます。ファイル。エラーがあることをユーザーに伝えるよりエレガントな方法があります。

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");

1

これを試して:

if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
    header('HTTP/1.0 404 Not Found');
    echo "<head><title>404 Not Found</title></head>";
    echo "<h1>Not Found</h1>";
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    echo "<p>The requested URL ".$uri." was not found on this server.</p>";
    exit();
}

0

私のウェブサイトでは、次のようなものを作成しました。

        $uri=$_SERVER['REQUEST_URI'];
        $strpos=strpos($uri, '.php');
        if ($strpos!==false){
        $e404="The page requested by you: &quot".$_SERVER['REQUEST_URI']."&quot, doesn't exists on this server.";
        $maybe=str_replace('.php','',$uri);
        $maybe=str_replace('/','',$maybe);
        die("<center><h1>404</h1><hr><h3>$e404</h3><h3>Maybe try <a href=$maybe>www.leaveyortexthere.p.ht/$maybe</a>?</center>");

}

お役に立てば幸いです。


-4

私はこの問題に気付きました。サーバー上の既存のリンクにリダイレクトすることでうまくいくと思います!サーバーが彼の404を返すため:
header('Redirect abbb.404.nonexist');<確かに存在しない


7
これを行うと、302も返されます。404をリダイレクトしない方がよいでしょう。代わりに、404ステータスコードを使用して、見つからないメッセージを表示します。
ロッキー

-17

サーバーのデフォルトの404ページを表示したい場合は、次のようにフレームにロードできます。

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';

4
これは、このサイトで私が見た中で最悪の答えに対する何らかのバッジを受け取るはずです。
MadTurki 14年

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