<?php

// 指定されたステータスコードを返すスクリプト
// statuscode.php?404;1 で ステータスコード404、本文あり になる
// statuscode.php?404;0 で ステータスコード404、本文なし になる

list($stcode$body$nocache) = explode(';'$_SERVER['QUERY_STRING']);
if (!
preg_match('/^[1-5]\d\d$/'$stcode)) {
    
$stcode 200;
    
$body true;
}

switch (
$stcode) {
case 
100:
    
header('HTTP/1.0 100 Continue');
    
$setumei '<h2>100 Continue</h2>・継続します<br />・要求は続行可能です<br />・クライアントが要求を継続できることを示します';
    break;
case 
101:
    
header('HTTP/1.0 101 Switching Protocols');
    
$setumei '<h2>101 Switching Protocols</h2>・プロトコルを切り替えます<br />・サーバによって更新ヘッダのプロトコルが切り替えられました<br />・プロトコル バージョンまたはプロトコルが変更されていることを示します';
    break;
case 
200:
    
header('HTTP/1.0 200 OK');
    
$setumei '<h2>200 OK</h2>・OK です<br />・要求は正常に終了しました<br />・要求が成功し、要求された情報が応答で返されたことを示します。これは受信される最も一般的なステータス コードです';
    break;
case 
201:
    
header('HTTP/1.0 201 Created');
    
$setumei '<h2>201 Created</h2>・作成されました<br />・要求は満足され、新規リソースが作成されました<br />・応答が送信される前に、要求によって新しいリソースが作成されたことを示します';
    break;
case 
202:
    
header('HTTP/1.0 202 Accepted');
    
$setumei '<h2>202 Accepted</h2>・受理されました<br />・処理するために要求が受け付けられましたが、その処理は完了していません<br />・要求が追加の処理のために受け入れられたことを示します';
    break;
case 
203:
    
header('HTTP/1.0 203 Non-Authoritative Information');
    
$setumei '<h2>203 Non-Authoritative Information</h2>・不当な情報です<br />・エンティティヘッダに返されたメタ情報は、元のサーバから入手できる完全なセットではありません<br />・返されたメタ情報が、元のサーバではなくキャッシュされたコピーから取得されたもので、正しくない可能性があることを示します';
    break;
case 
204:
    
header('HTTP/1.0 204 No Content');
    
$setumei '<h2>204 No Content</h2>・コンテンツがありません<br />・サーバは要求を処理しましたが、送り返す新規の情報がありません<br />・要求が正常に処理され、応答が意図的に空白になっていることを示します';
    break;
case 
205:
    
header('HTTP/1.0 205 Reset Content');
    
$setumei '<h2>205 Reset Content</h2>・コンテンツをリセットします<br />・要求は完了しました。クライアント プログラムは要求の送信元であるドキュメント ビューをリセットして、ユーザが次の入力操作をできるようにする必要があります<br />・クライアントが現在のリソースを再び読み込むのではなく、リセットする必要があることを示します';
    break;
case 
206:
    
header('HTTP/1.0 206 Partial Content');
    
$setumei '<h2>206 Partial Content</h2>・コンテンツの一部分です<br />・サーバによってリソースの GET 要求の一部が処理されました<br />・応答が GET 要求によって要求された応答の一部であることを示します。これにはバイト範囲が含まれます';
    break;
case 
300:
    
header('HTTP/1.0 300 Multiple Choices');
    
$setumei '<h2>300 Multiple Choices</h2>・複数の選択肢があります<br />・サーバから何を返すか判断できませんでした<br />・要求された情報に複数の表現があることを示します。既定のアクションでは、このステータスをリダイレクトとして扱い、この応答と関連付けられた Location ヘッダの内容に従います';
    break;
case 
301:
    
header('HTTP/1.0 301 MovedPermanently');
    
$setumei '<h2>301 MovedPermanently</h2>・恒久的に移動しました<br />・要求されたリソースは新規の固定 URI (Uniform Resource Identifier) に割り当てられました。このリソースを今後参照するときは、返された URI のいずれかを使用する必要があります<br />・要求された情報が Location ヘッダで指定される URI に移動したことを示します。このステータスを受信したときの既定のアクションは、応答に関連付けられている Location ヘッダの追跡です。元の要求メソッドが POST の場合、リダイレクトされた要求は GET メソッドを使用します';
    break;
case 
302:
    
header('HTTP/1.0 302 Found');
    
$setumei '<h2>302 Found</h2>・見つかりました<br />・要求されたリソースは一時的に別の URI (Uniform Resource Identifier) に格納されています<br />・要求された情報が Location ヘッダで指定される URI にあることを示します。このステータスを受信したときの既定のアクションは、応答に関連付けられている Location ヘッダの追跡です。元の要求メソッドが POST の場合、リダイレクトされた要求は GET メソッドを使用します';
    break;
case 
303:
    
header('HTTP/1.0 303 See Other');
    
$setumei '<h2>303 See Other</h2>・ほかを参照してください<br />・要求への応答は別の URI (Uniform Resource Identifier) にあります。この応答を取得するには、GET HTTP メソッドを使用します<br />・POST の結果として、Location ヘッダで指定された URI にクライアントを自動的にリダイレクトします。Location ヘッダで指定されるリソースへの要求は、GET で行います';
    break;
case 
304:
    
header('HTTP/1.0 304 Not Modified');
    
$setumei '<h2>304 Not Modified</h2>・変更されていません<br />・要求されたリソースは変更されていません<br />・クライアントのキャッシュされたコピーが最新のものであることを示します。リソースの内容は転送されません';
    break;
case 
305:
    
header('HTTP/1.0 305 Use Proxy');
    
$setumei '<h2>305 Use Proxy</h2>・プロキシを使用します<br />・要求されたリソースには、場所フィールドで指定されたプロキシを通じてアクセスする必要があります<br />・要求が Location ヘッダで指定される URI でプロキシ サーバを使用する必要があることを示します';
    break;
case 
306:
    
header('HTTP/1.0 306 Unused');
    
$setumei '<h2>306 Unused</h2>・作成中の HTTP/1.1 仕様の拡張案です';
    break;
case 
307:
    
header('HTTP/1.0 307 Temporary Redirect');
    
$setumei '<h2>307 Temporary Redirect</h2>・一時的なリダイレクトです<br />・要求された情報が Location ヘッダで指定される URI にあることを示します。このステータスを受信したときの既定のアクションは、応答に関連付けられている Location ヘッダの追跡です。元の要求メソッドが POST の場合、リダイレクトされた要求も POST メソッドを使用します';
    break;
case 
400:
    
header('HTTP/1.0 400 Bad Request');
    
$setumei '<h2>400 Bad Request</h2>・無効な要求です<br />・サーバが要求を理解できないことを示します。 BadRequest は、他のエラーが適用されない場合や、正確なエラーを確認できないか、独自のエラー コードがない場合に送信されます';
    break;
case 
401:
    
header('HTTP/1.0 401 Unauthorized');
    
$setumei '<h2>401 Unauthorized</h2>・未許可です<br />・要求されたリソースには、ユーザの認証が必要です<br />・要求されたリソースが認証を要求することを示します。WWW-Authenticate ヘッダには、認証を実行する方法の詳細が格納されます';
    break;
case 
402:
    
header('HTTP/1.0 402 Payment Required');
    
$setumei '<h2>402 Payment Required</h2>・支払いが必要です<br />・現在は HTTP プロトコルに実装されていません<br />・今後の使用のために予約されています';
    break;
case 
403:
    
header('HTTP/1.0 403 Forbidden');
    
$setumei '<h2>403 Forbidden</h2>・禁止されています<br />・要求はサーバで解読されましたが、その処理は拒否されました<br />・サーバが要求の実行を拒否していることを示します';
    break;
case 
404:
    
header('HTTP/1.0 404 Not Found');
    
$setumei '<h2>404 Not Found</h2>・見つかりません<br />・要求された URI (Uniform Resource Identifier) に一致するものをサーバ上で見つけることができませんでした<br />・要求されたリソースがサーバに存在していないことを示します';
    break;
case 
405:
    
header('HTTP/1.0 405 Method Not Allowed');
    
$setumei '<h2>405 Method Not Allowed</h2>・メソッドは許可されていません<br />・使用されている HTTP 動詞は許可されていません<br />・要求メソッド (POST または GET) が要求リソースで許可されていないことを示します';
    break;
case 
406:
    
header('HTTP/1.0 406 Not Acceptable');
    
$setumei '<h2>406 Not Acceptable</h2>・受け付けられません<br />・クライアントで受け付け可能な応答が見つかりませんでした<br />・クライアントが Accept ヘッダでリソースの利用可能な任意の表現を受け入れないことを指定していることを示します';
    break;
case 
407:
    
header('HTTP/1.0 407 Proxy Authentication Required');
    
$setumei '<h2>407 Proxy Authentication Required</h2>・プロキシによる認証が必要です<br />・プロキシによる認証が必要です<br />・要求されたプロキシが認証を要求することを示します。Proxy-authenticate ヘッダには、認証を実行する方法の詳細が格納されます';
    break;
case 
408:
    
header('HTTP/1.0 408 Request Timeout');
    
$setumei '<h2>408 Request Timeout</h2>・要求はタイムアウトしました<br />・要求待ちでサーバがタイムアウトしました<br />・サーバが要求を予期している時間内にクライアントが要求を送信しなかったことを示します';
    break;
case 
409:
    
header('HTTP/1.0 409 Conflict');
    
$setumei '<h2>409 Conflict</h2>・競合しています<br />・リソースの現在の状態と矛盾するため、要求は完了できませんでした。詳しい情報を再度送信する必要があります<br />・サーバ上の競合のために要求を実行できないことを示します';
    break;
case 
410:
    
header('HTTP/1.0 410 Gone');
    
$setumei '<h2>410 Gone</h2>・移動しました<br />・要求されたリソースはサーバにありません。転送先アドレスは不明です<br />・要求されたリソースが利用できないことを示します';
    break;
case 
411:
    
header('HTTP/1.0 411 Length Required');
    
$setumei '<h2>411 Length Required</h2>・長さが必要です<br />・内容の長さが定義されていない要求の受け入れをサーバが拒否しました<br />・必要な Content-length ヘッダがないことを示します';
    break;
case 
412:
    
header('HTTP/1.0 412 Precondition Failed');
    
$setumei '<h2>412 Precondition Failed</h2>・前提条件を満たしていません<br />・要求の 1 つ以上のヘッダ フィールドにある事前条件がサーバでテストされ、不正と判定されました<br />・この要求で設定された条件が満たされず、要求を実行できないことを示します。条件は、If-Match、If-None-Match、If-Unmodified-Since などの条件要求ヘッダで設定します';
    break;
case 
413:
    
header('HTTP/1.0 413 Request Entity Too Large');
    
$setumei '<h2>413 Request Entity Too Large</h2>・要求されたエンティティが大きすぎます<br />・要求のエンティティがサーバで処理しようとしている数または処理可能な数より大きいため、要求の処理はサーバで拒否されました<br />・要求が大きすぎて、サーバで処理できないことを示します';
    break;
case 
414:
    
header('HTTP/1.0 414 Request-Uri Too Long');
    
$setumei '<h2>414 Request-Uri Too Long</h2>・要求された URI が長すぎます<br />・要求の URI (Uniform Resource Identifier) がサーバで解釈する長さより長いため、要求の処理はサーバで拒否されました<br />・URI が長すぎることを示します';
    break;
case 
415:
    
header('HTTP/1.0 415 Unsupported Media Type');
    
$setumei '<h2>415 Unsupported Media Type</h2>・サポートされていないメディアの種類です<br />・要求されたリソースでは、要求のエンティティの形式が、要求されたメソッドに対してサポートされていません。このため、要求の処理はサーバで拒否されました<br />・その要求の種類がサポートされていないことを示します';
    break;
case 
416:
    
header('HTTP/1.0 416 Requested Range Not Satisfiable');
    
$setumei '<h2>416 Requested Range Not Satisfiable</h2>・要求された範囲内にありません<br />・要求された範囲は不十分です<br />・リソースから要求されたデータの範囲を返すことができないことを示します。その原因は、範囲の先頭がリソースの先頭より前であるか、範囲の末尾がリソースの末尾より後ろであるかのいずれかです';
    break;
case 
417:
    
header('HTTP/1.0 417 Expectation Failed');
    
$setumei '<h2>417 Expectation Failed</h2>・要求どおりの処理が不可能です<br />・予測は失敗しました<br />・サーバが Expect ヘッダで指定された要求を満たすことができないことを示します';
    break;
case 
500:
    
header('HTTP/1.0 500 Internal Server Error');
    
$setumei '<h2>500 Internal Server Error</h2>・サーバの内部エラーです<br />・サーバで一般的なエラーが発生したことを示します';
    break;
case 
501:
    
header('HTTP/1.0 501 Not Implemented');
    
$setumei '<h2>501 Not Implemented</h2>・実装されていません<br />・要求の処理に必要な機能をサーバがサポートしていません<br />・サーバが要求された機能をサポートしていないことを示します';
    break;
case 
502:
    
header('HTTP/1.0 502 Bad Gateway');
    
$setumei '<h2>502 Bad Gateway</h2>・無効なゲートウェイです<br />・ゲートウェイまたはプロキシとして動作しているサーバが、要求を処理するためにアクセスしたアップストリーム サーバから不正な応答を受け取りました<br />・中間プロキシ サーバが別のプロキシまたは元のサーバから無効な応答を受け取ったことを示します';
    break;
case 
503:
    
header('HTTP/1.0 503 Service Unavailable');
    
$setumei '<h2>503 Service Unavailable</h2>・サービスは利用できません<br />・サービスは一時的に過負荷になっています<br />・高い負荷または保守のため、サーバを一時的に利用できないことを示します';
    break;
case 
504:
    
header('HTTP/1.0 504 Gateway Timeout');
    
$setumei '<h2>504 Gateway Timeout</h2>・ゲートウェイはタイムアウトしました<br />・ゲートウェイ待ちで要求がタイムアウトしました<br />・中間プロキシ サーバが別のプロキシまたは元のサーバからの応答を待機している間にタイムアウトしたことを示します';
    break;
case 
505:
    
header('HTTP/1.0 505 Http Version Not Supported');
    
$setumei '<h2>505 Http Version Not Supported</h2>・サポートされていない HTTP のバージョンです<br />・要求のメッセージで使用されている HTTP プロトコルのバージョンが、サーバでサポートされていません。またはサポートが拒否されています<br />・要求された HTTP バージョンがサーバでサポートされていないことを示します';
    break;
default:
    
header('HTTP/1.0 '.$stcode.' Unknown');
    
$setumei '<h3>'.$stcode.' Unknown</h3>指定されたステータスコードは存在していないかもしれません。';
}
if (
$setumei) {
    switch (
substr($stcode01)) {
    case 
1:
        
$setumei preg_replace('|</h2>|''</h2><h3>1xx Informational リクエストを受け取って処理しています</h3>'$setumei1);
        break;
    case 
2:
        
$setumei preg_replace('|</h2>|''</h2><h3>2xx Successful リクエストした動作を正しく理解し、承認されました</h3>'$setumei1);
        break;
    case 
3:
        
$setumei preg_replace('|</h2>|''</h2><h3>3xx Redirection リクエストを完了するにはさらなる操作が必要です</h3>'$setumei1);
        break;
    case 
4:
        
$setumei preg_replace('|</h2>|''</h2><h3>4xx Client Error リクエストの構文に誤りが存在するか、サーバが受け取ることはできません</h3>'$setumei1);
        break;
    case 
5:
        
$setumei preg_replace('|</h2>|''</h2><h3>5xx Server Error サーバはリクエストを受け取りましたが、処理できません。他のサーバで処理できる可能性があります</h3>'$setumei1);
        break;
    }
    
$setumei .= '<hr />';
}

if (
$nocache) {
    
header('Pragma: no-cache');
    
header('Cache-Control: no-store');
}

if (
$body) {
    
header('Content-Type: text/html; charset=EUC-JP');
    echo <<<END
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja-JP">
<head>
    <meta http-equiv="content-type" content="text/html; charset=EUC-JP" />
    <title>指定したステータスコードを返すページ</title>
</head>
<body>
$setumei
Proxomitron の \$RDIR() などと組み合わせてテストにご利用ください。<br />
<a href="statuscode.php?404;1">statuscode.php?404;1</a> で ステータスコード404、本文あり になり、<br />
<a href="statuscode.php?404;0">statuscode.php?404;0</a> で ステータスコード404、本文なし になります。<br />
statuscode.php?ステータスコード;本文有り無し;no-cache有り無し になります。
<hr />
このスクリプトは「<a href="http://homepage1.nifty.com/yito/anhttpd/statuscode.html">HTTPステータスコード一覧</a>」を参考に作られました。多謝。 <a href="statuscode.phps">ソース</a>
</body></html>
END;
}

?>