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

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

4

16 に答える 16

307

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

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

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

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

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

404 ヘッダーの提供に加えて、PHP は実際の 404 ページの出力を担当するようになりました。

于 2009-01-13T01:39:44.080 に答える
16

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

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

$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
于 2012-10-07T07:20:35.133 に答える
14

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

if(strstr($_SERVER['REQUEST_URI'],'index.php')){
  header('HTTP/1.0 404 Not Found');
  readfile('404missing.html');
  exit();
}
于 2011-06-08T12:01:18.450 に答える
12

PHP 5.4以降、できるようになりましたhttp_response_code(404);

于 2013-12-17T21:50:11.963 に答える
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 ページとまったく同じ結果を提供しました。オブザーバーは、404 を返す既存の PHP ページと存在しないページを区別できません。

于 2013-07-02T03:45:26.803 に答える
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.");
}
于 2010-10-10T05:55:12.070 に答える
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 を簡単に実行できます。

于 2011-06-19T05:20:06.350 に答える
1

あなたはそれを正しくやっていますが、それはいくらかの洗練を使用することができます. それは対処されているように見えるので、実用的なアプリケーションの利点について話しましょう:

多言語のテクニカル ドキュメントの膨大なコレクションがある私たちの古い Web サイトでは、if else 条件内でこれを実行していました。

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

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

    header('HTTP/1.0 404 Not Found');
    die("NO FILE HERE");
于 2013-07-16T21:51:41.600 に答える
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();
}
于 2015-07-22T05:35:03.803 に答える
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>");

}

お役に立てば幸いです。

于 2013-08-10T23:20:19.770 に答える
-4

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

于 2010-11-11T07:43:48.293 に答える
-17

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

echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';
于 2012-07-10T23:07:25.377 に答える