web-dev-qa-db-ja.com

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

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

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

141
Yrrol

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

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

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

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

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

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

306
Alan Storm
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つのエコー行を見ると、そこにコンテンツが表示されます。必要に応じてカスタマイズできます。

78
Evan Fosmark

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

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

74
Bob Fanger

レコードの場合、これはすべての場合のハンドラーです。

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

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

デフォルトのサーバー404ページがあれば、それをロードします。 Apache用に定義されたもの:

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

Php 5.4から http_response_code(404); ができるようになりました

13
rparker

@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
Earth Engine

で試してください:

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

さようなら!

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

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
artoodetoo
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
Jesse

これを試して:

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();
}
1

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

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

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

問題(役に立たないメッセージと悪いユーザーエクスペリエンスに加えて)は、通常、リンククローラー(この場合は整合性)を使用して、悪いリンクと失われたドキュメントをチェックアウトすることです。これは、ファイルが存在したことを示すエラー応答なしの完全に正しい200を得たことを意味します。 IntegrityはPDFを期待していることを知らなかったため、phpで404ヘッダーを手動で追加する必要がありました。ダイの上にコードを追加すると(その後は何も実行されず、ヘッダーはレンダリングされたhtmlの前に常にあるため)、整合性(ブラウザーとほぼ同じように動作する)は404を返し、欠落している場所を正確に知ることができますファイル。エラーがあることをユーザーに伝えるよりエレガントな方法がありますが、404エラーを提供することで、ブラウザやブラウザのようなプログラムにエラーを通知するだけでなく、(間違っている場合は私が修正したと信じています)これらのエラーをサーバーログに記録すると、404を簡単にgrepできます。

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

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

1
Gumbo

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

        $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>");

}

それがあなたのお役に立てば幸いです。

0
GGG