HTTPステータスコード
(HTTPレスポンスコード)
PHPではこんな感じに使う。
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.example.com/");
exit;
$time_newest=time();
header( "Last-Modified: " . gmdate( "D, d M Y H:i:s", $time_newest ) . " GMT" );
RFC 2616の§6、§10で仕様が定められている。
CGIのハナシ
NPHスクリプト[NPH方式]
Non-Parsed Hederの略。
『nph-』で始まるファイル名のときにNPHで実行される。
Apacheサーバの設定が必要。
通常のCGIでは
CGI→wwwサーバー→wwwブラウザ
の順でデータが処理されるものを
CGI→wwwブラウザ
に返すようにするシステム
メリット
wwwサーバーを介さないので処理が軽くなる
バッファリングをしない[Apache1.2以前の話]
デメリット
wwwサーバーログにエラーが残らない
『nph-』で始まるファイル名に変更しなければいけない
# HTTPヘッダーステータスコードはどんなヘッダーより先に送ります。
print "HTTP/1.0 200 OK\r\n";
# クッキーをセットする場合にはこのように書きます。
print "Set-Cookie: NAME=VALUE\r\n";
# コンテントタイプ
print "Content-type: text/html\r\n";
# HTTPヘッダ終わり
print "\r\n";
ページ更新をしてもヘッダー以外のデータを送信しない
チャットや掲示板などでデータが更新さてれない場合に、負荷軽減のため、
データの更新がなければ、レスポンスヘッダだけ送信して、何もデータを送信しないようにすることができる。
このときCGIリクエストを送信した画面を表示したままになります。
print "HTTP/1.0 204 No Content\r\n";
# キャッシュしない
print "Cache-control: no-cache\r\n";
print "Pragma: no-cache\r\n";
# キャッシュの削除(期限を過去にする)
print "Expires: Sat, 01-Jan-2000 01:00:00 GMT\r\n";
print "\r\n";
exit;
Apache 1.2ではapacheサーバはバッファリングをしていましたが、
Apache 1.3 ではバッファリングをしないのであまり意味がなくなったようです。
ということでHTTPヘッダー情報を好きに生成したいという理由だけであれば asisを使ったほうがよいようです。
Apache モジュール mod_asis
as isは『そのまま』という意味です。
send-as-is ハンドラに結び付けられたファイルは、HTML であるか画像であるかに関わらず、ほとんどそのままをクライアントに返します。
HTTPステータスコードの一覧 HTTP/1.0 HTTP/1.1
1.0 | 1.1 | Code | 状態 | 説明 |
---|---|---|---|---|
1xx: Informational (情報) | ||||
× | ○ | 100 | Continue | リクエストの先頭部分を受信したのでクライアントはリクエストの続きを送信してもよい |
× | ○ | 101 | Switching Protocols | サーバはクライアントの指示に従いプロトコルを変更する |
2xx: Success (成功) | ||||
○ | ○ | 200 | OK | リクエストは正常に処理された |
○ | ○ | 201 | Created | 新しいURIが作成されたときにサーバから返される |
○ | ○ | 202 | Accepted | リクエストは受け取られたが、すぐに処理の対象とはならない |
× | ○ | 203 | Non-Authoritative Information | エンティティヘッダの情報が本来のサーバが発信したものではない |
○ | ○ | 204 | Not Content | エンティティボディが返されていない |
× | ○ | 205 | Reset Cotent | UAは使用されたフォームをクリアして、次のリクエストに備えるべきである |
× | ○ | 206 | Partial Content | サーバは要求されたサイズの部分的なデータを返した |
3xx: Redirection (転送) | ||||
× | ○ | 300 | Multiple Choices | リクエストされたURIは2つ以上のリソースを有している |
○ | ○ | 301 | Moved Permanenty | リクエストされたURIは永続的に移転している。Locationヘッダ中に移転先が記される |
○ | ○ | 302 | Moved Temporarily | リクエストされたURIは一時的に移転している。Locationヘッダ中に移転先が記される |
× | ○ | 303 | See Other | リクエストされたURIは別のURIに存在する |
○ | ○ | 304 | Not Modified | 指定日時以降にドキュメントが変更されていないことを示す |
× | ○ | 305 | Use Proxy | Location ヘッダで指定されるProxy経由でアクセスしなくてはならない |
× | × | 306 | - | 未使用 |
× | ○ | 307 | Temporary Redirect | リクエストされたリソースは一時的に移動している。一時的なリダイレクト先URIを示す |
4xx: Client Error (クライアントエラー) | ||||
○ | ○ | 400 | Bad Request | クライアントのリクエストに文法エラーがあった |
○ | ○ | 401 | Unauthorized | ユーザは認証されていないためリソースにアクセスできない |
× | ○ | 402 | Payment Required | 未使用 |
○ | ○ | 403 | Forbidden | リクエストは何らかの理由で拒否された |
○ | ○ | 404 | Not Found | 指定されたリソースは存在しない |
× | ○ | 405 | Method Not Allowed | クライアントの指定したメソッドが無効 |
× | ○ | 406 | Not Acceptable | リクエストされたデータはあるが、指定された形式と異なる |
× | ○ | 407 | Proxy Authentication Required | Proxyサーバが認証を要求している |
× | ○ | 408 | Request Time-Out | タイムアウトしたため接続が切断された |
× | ○ | 409 | Conflict | リクエストが他のリクエストと矛盾している |
× | ○ | 410 | Gone | リクエストされたURIは永久的にそのサーバから削除されてしまった |
× | ○ | 411 | Length Required | Contents-Lengthヘッダ指定がないと受け付けられないリクエストにLengthなしでリクエストした |
× | ○ | 412 | Precondition Failed | そのリクエスト中のIfヘッダ条件に偽が返された |
× | ○ | 413 | Request Entity Too Large | リクエストのエンティティが大きすぎて、処理できない |
× | ○ | 414 | Request Too Long | リクエストしたURLが長すぎて処理できない |
× | ○ | 415 | Unsupported Media Type | 未知の形式でリクエストされたため処理できない |
× | ○ | 416 | Requested Range Not Satisfiable | |
× | ○ | 417 | Expectation Failed | |
5xx: Server Error (サーバエラー) | ||||
○ | ○ | 500 | Internal Server Error | サーバ内部エラー。CGIの実行等になんらかのエラーが発生した |
○ | ○ | 501 | Not Implemented | サーバに未実装の処理をリクエストされたためエラーが発生した |
○ | ○ | 502 | Bad Gateway | 無効なレスポンスを受信した |
○ | ○ | 503 | Service Unavailable | 一時的にサービスは利用できないでいるが、将来的には回復の予定であることを示す |
× | ○ | 504 | Gateway Time-Out | 408とにているが、サーバ側のタイムアウト |
× | ○ | 505 | HTTP Version Not Supported | 要求されたHTTPのバージョンをサーバは対応していない |