web-dev-qa-db-ja.com

リダイレクトなしでPHPで401ヘッダーを投げる

不正なIPをMySQLテーブルに追加するphp関数があります。

私のサイトの各ページはテーブルをチェックし、一致が見つかった場合はHTTP 401ヘッダーをスローします。

if(badCrawler()){
    header("HTTP/1.1 401 Unauthorized");
    header("Location: error401.php");
}

URLを変更せずにこれを行うことは可能ですか?

ありがとう

22
Jms Bnd

承知しました。 401ヘッダーの直後のexitheader("Location...")はまったく必要ありません。

if(badCrawler()){
    header("HTTP/1.1 401 Unauthorized");
    exit;
}

サイドノート:401は通常、認証要求と組み合わせて使用​​されます。

仕様 から:

応答には、要求されたリソースに適用可能なチャレンジを含むWWW-Authenticateヘッダーフィールド(セクション14.47)を含める必要があります

403 Forbiddenを使用してアクセスを拒否するか、悪いクローラーにページがもう存在しないと思わせたい場合は404 Not Foundを使用する方がよい場合があります。

header("HTTP/1.0 404 Not Found");
exit;

コンテンツを送信する

一部のブラウザでは、404応答が空白ページになる場合があることに注意してください。これが発生する理由の完全な説明については、 this thread のトップアンサーを参照してください。基本的にヘッダーは機能していますが、HTMLコンテンツを表示するのはユーザー次第です)。

解決策は簡単で、exitステートメントの直前にコンテンツをエコーし​​ます(または別のファイルを含めます)。

45
jszobody

これは少し古いことを知っていますが、「php、401s」のグーグル検索でポップアップしました。

ここでの問題は、ページがerror401.phpにリダイレクトするときにthat pageが200 OKを返すことです。error401.phpが正常にロードされたためです。本当に401ページを表示したい場合、これはどうですか?

if(badCrawler()){
     header("HTTP/1.1 401 Unauthorized");
     include("error401.php");
     exit;
}
7
Simon Cooke