if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
なぜこれが機能しないのですか?空白のページが表示されます。
if (strstr($_SERVER['REQUEST_URI'],'index.php')) {
header('HTTP/1.0 404 Not Found');
}
なぜこれが機能しないのですか?空白のページが表示されます。
回答:
あなたのコードは技術的に正しいです。その空白ページのヘッダーを見ると、404ヘッダーが表示され、他のコンピューター/プログラムは、ファイルが見つからないとして応答を正しく識別することができます。
もちろん、ユーザーはまだSOLです。通常、404はWebサーバーによって処理されます。
問題は、WebサーバーがPHPページの処理を開始すると、404ページを処理するポイントをすでに通過していることです。
PHPは、404ヘッダーを提供するだけでなく、実際の404ページを出力する役割も果たします。
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つのエコー行を見ると、そこにコンテンツが表示されます。好きなようにカスタマイズできます。
これは正しい動作です。404ページのコンテンツを作成するのはあなた次第です。
404ヘッダーは、ファイルが存在するかどうかを判断するためにスパイダーとダウンロードマネージャーによって使用されます。
(404ヘッダーのあるページは、Googleや他の検索エンジンによってインデックスに登録されません)
ただし、通常のユーザーはhttp-headersを参照せず、そのページを通常のページとして使用します。
記録のために、これはすべての場合のハンドラです:
<?php
header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
header("Status: 404 Not Found");
$_SERVER['REDIRECT_STATUS'] = 404;
?> <!-- 404 contents below this line -->
die()
必要?
たとえば、apacheに定義されている場合は、デフォルトのサーバー404ページをロードします。
if(strstr($_SERVER['REQUEST_URI'],'index.php')){
header('HTTP/1.0 404 Not Found');
readfile('404missing.html');
exit();
}
PHP 5.4以降、次のことができるようになりました http_response_code(404);
@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と存在しないページを区別できません。
少し短いバージョン。奇数のエコーを抑制します。
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.");
}
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を簡単に実行することだけです。
それはいくつかの精製を使用する可能性がありますが、あなたはそれを正しくやっています。それは解決されたようですので、実際のアプリケーションの利点について話しましょう:
多言語の技術ドキュメントの大規模なコレクションを持っている私たちの古いウェブサイトは、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");
これを試して:
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();
}
私のウェブサイトでは、次のようなものを作成しました。
$uri=$_SERVER['REQUEST_URI'];
$strpos=strpos($uri, '.php');
if ($strpos!==false){
$e404="The page requested by you: "".$_SERVER['REQUEST_URI']."", 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>");
}
お役に立てば幸いです。
私はこの問題に気付きました。サーバー上の既存のリンクにリダイレクトすることでうまくいくと思います!サーバーが彼の404を返すため:
header('Redirect abbb.404.nonexist');
<確かに存在しない
サーバーのデフォルトの404ページを表示したい場合は、次のようにフレームにロードできます。
echo '<iframe src="/something-bogus" width="100%" height="100%" frameBorder="0" border="0" scrolling="no"></iframe>';