header

(PHP 3, PHP 4 , PHP 5)

header -- 生のHTTPヘッダを送信する

説明

int header ( string string [, bool replace [, int http_response_code]])

header()関数は、HTMLファイル の送信に先立って、生のHTTPヘッダ文字列を送信 するために使用します。HTTPヘッダの詳細は、 HTTP 1.1 Specificationを参照 して下さい。

オプションのパラメータ replace は、ヘッダ が前に送信された類似のヘッダを置換するか、または、同じ形式の二番 目のヘッダを追加するかどうかを指定します。デフォルトでは、この関 数は、置換を行ないますが、二番目の引数にFALSE を指定すると、同 じ型の複数のヘッダを強制的に生成します。例えば、

<?php
header
('WWW-Authenticate: Negotiate');
header('WWW-Authenticate: NTLM', FALSE);
?>

第二オプション引数http_response_codeは HTTPレスポンスコードを強制的に指定の値にします。(この引数は PHP4.3.0以降で有効です)

特殊なheaderコールが2種類あります。最初のは、 文字列 "HTTP/" から始まる全てのヘッダ(大文字・小文字は区別されません)です。この ヘッダは、送信するHTTPステータスコードを示すために使用されます。 例えば、存在しないファイルへのリクエストを処理するためにあるPHPスクリ プトを使用するよう(ErrorDocumentディレクティブ により)Apacheを設定する場合、そのスクリプトが正しいステータスコー ドを返すようにする必要があります。

<?php
header
("HTTP/1.0 404 Not Found");
?>

注意: 実際にheader()が最初にコールされたか どうかにかかわらず、HTTPステータスヘッダ行は クライアントに対し常に最初に送信されます。 HTTPヘッダが既に送信されていない限り、 header()をコールすることでステータスは 常に上書きされます。

注意: PHP 3では、このコードは、PHPがApacheモジュール版としてコンパイル されている場合にのみ動作します。Statusヘッダを 用いて同じ効果を得ることが可能です。

<?php
header
("Status: 404 Not Found");
?>

2番目の特別なヘッダは、"Location" ヘッダーです。このヘッダーがブラウザに返されるだけではなく、 ブラウザにREDIRECT (302)ステータスコードを返します。 (3xxステータスコードが既に送信されていない場合にのみ)

<?php
header
("Location: http://www.example.com/"); /* Redirect browser */

exit;                 /* リダイレクトを行う際に以下のコードが
                         実行されないようにする */
?>

注意: HTTP/1.1では、スキーム、ホスト名、絶対パスを含む絶対 URILocation: の引数として必要ですが、いくつかのクライアントでは相対URIも受け つけます。通常、相対URIから絶対URIを作成するために $HTTP_SERVER_VARS['HTTP_HOST'],$HTTP_SERVER_VARS['PHP_SELF'], dirname()を使用することが可能です。

<?php
header("Location: http://".$_SERVER['HTTP_HOST']
                      .dirname($_SERVER['PHP_SELF'])
                      ."/".$relative_url);
?>

PHPスクリプトはしばしば動的に HTML を生成するため、クライアントブ ラウザやサーバーおよびクライアントブラウザの間でプロキシがキャッ シュを行ったりするべきではありません。多くのプロキシとクライアン トでは、以下のコードにより強制的にキャッシュを無効にできます。

<?php
// 日付が過去
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// 常に修正されている
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>

注意: 上記のヘッダを全て出力しなかったとしてもページのキャッシュが行 われない場合があることに気付くかもしれません。デフォルトのブラ ウザのキャッシュの動作をユーザが変更できる手段はいくつもありま す。上記のヘッダを送信することにより、スクリプトの出力がキャッ シュされる可能性がある設定を上書きするべきです。

加えて、session_cache_limiter()および 設定session.cache_limiterをセッションが使用 された際にキャッシュ関係のヘッダを正しく自動的に生成するために 使用できます。

覚えておいて頂きたいのは、header() 関数は、通 常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の出 力の前にコールする必要があることです。 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数 に空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTMLファ イルを使用している場合でも存在します。

<html>
<?php
/* これはエラーとなります。この上に出力があることに注目してください。
* それはheader()のコールより前であるということになります */
header('Location: http://www.example.com/');
?>

注意: PHP 4では、この問題に対処するために出力のバッファリングを使用す ることが可能です。この場合、ブラウザへの出力が送信するまでサー バに全てバッファリングされるオーバーヘッドがあります。出力バッ ファリングは、ob_start()ob_end_flush()をスクリプトでコールするか php.iniまたはサーバ設定ファイルの設定ディ レクティブoutput_bufferingを設定することによ り行うことが可能です。

PDFファイルを生成するといったように送信するデータを保存するかどう かユーザにプロンプトを表示したい場合、推奨されるファイル名を指定 してブラウザに保存ダイアログを表示させるContent-Dispositionヘッダを使用可能で す。

<?php
// PDFを出力しようとしている
header("Content-type: application/pdf");

// それはdownloaded.pdfという名前である
header("Content-Disposition: attachment; filename=downloaded.pdf");

// オリジナルのPDFは original.pdf
readfile('original.pdf');
?>

注意: Microsoft Internet Explorer 4.01にはこれが動作しないというバグ があります。この解決策はありません。Microsoft Internet Explorer 5.5にもこれを妨げるバグがあります。これは、サービスパック2以降 とすることで修整可能です。

注意: WWW-Authenticateヘッダ(HTTP認証に利用される)を 使用する際、safe modeが 有効になっている場合は、スクリプトのUIDが WWW-Authenticateヘッダ realm部として送信されます。

headers_sent(), setcookie()及び HTTP認証の節も参照下さ い。