header()関数は、HTMLファイル の送信に先立って、生のHTTPヘッダ文字列を送信 するために使用します。HTTPヘッダの詳細は、 HTTP 1.1 Specificationを参照 して下さい。
オプションのパラメータ replace は、ヘッダ が前に送信された類似のヘッダを置換するか、または、同じ形式の二番 目のヘッダを追加するかどうかを指定します。デフォルトでは、この関 数は、置換を行ないますが、二番目の引数にFALSE を指定すると、同 じ型の複数のヘッダを強制的に生成します。例えば、
特殊なheaderコールが2種類あります。最初のは、"Location" ヘッダーです。このヘッダーはブラウザに返されるだけではなく、 ApacheにREDIRECTステータスコードを返します。スクリプトの作者にとっ ては、この点はあまり重要ではありませんが、Apacheの内部動作を知る 人にとっては、理解しておくべき重要なこととなります。
header("Location: http://www.php.net/"); /* ブラウザをPHP Web サイトに リダイレクトする */ exit; /* リダイレクトを行う際に以下のコードが 実行されないようにする */ |
注意 HTTP/1.1では、スキーム、ホスト名、絶対パスを含む絶対 URIがLocation: の引数として必要ですが、いくつかのクライアントでは相対URIも受け つけます。通常、相対URIから絶対URIを作成するために $HTTP_SERVER_VARS['HTTP_HOST'],$HTTP_SERVER_VARS['PHP_SELF'], dirname()を使用することが可能です。
2番目の特別なヘッダは、文字列"HTTP/" から始まる全てのヘッダ(大文字・小文字は区別されません)です。この ヘッダは、送信するHTTPステータスコードを示すために使用されます。 例えば、存在しないファイルへのリクエストを処理するためにあるPHPスクリ プトを使用するよう(ErrorDocumentディレクティブ により)Apacheを設定する場合、そのスクリプトが正しいステータスコー ドを返すようにする必要があります。
注意 PHP 3では、このコードは、PHPがApacheモジュール版としてコンパイ ルされている場合にのみ動作します。Statusヘッ ダを用いて同じ効果を得ることが可能です。
PHPスクリプトはしばしば動的に HTML を生成するため、クライアントブ ラウザやサーバーおよびクライアントブラウザの間でプロキシがキャッ シュを行ったりするべきではありません。多くのプロキシとクライアン トでは、以下のコードにより強制的にキャッシュを無効にできます。
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 日付が過去 header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // 常に修正されている header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1 header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); // HTTP/1.0 |
注意 上記のヘッダを全て出力しなかったとしてもページのキャッシュが行 われない場合があることに気付くかもしれません。デフォルトのブラ ウザのキャッシュの動作をユーザが変更できる手段はいくつもありま す。上記のヘッダを送信することにより、スクリプトの出力がキャッ シュされる可能性がある設定を上書きするべきです。
加えて、session_cache_limiter()および 設定session.cache_limiterをセッションが使用 された際にキャッシュ関係のヘッダを正しく自動的に生成するために 使用できます。
覚えておいて頂きたいのは、header() 関数は、通 常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の出 力の前にコールする必要があることです。 頻出するエラーとして、include() または require() 関数、他のファイルをアクセスする関数 に空白または空行があり、header() の前に出力が 行われてしまうというものがあります。同じ問題は、単一の PHP/HTMLファ イルを使用している場合でも存在します。
<?php require("user_logging.inc") ?> <?php header ("Content-type: audio/x-pn-realaudio"); ?> // 動作しません。上の空行に注意して下さい。 |
注意 PHP 4では、この問題に対処するために出力のバッファリングを使用す ることが可能です。この場合、ブラウザへの出力が送信するまでサー バに全てバッファリングされるオーバーヘッドがあります。出力バッ ファリングは、ob_start()と ob_end_flush()をスクリプトでコールするか php.iniまたはサーバ設定ファイルの設定ディ レクティブoutput_bufferingを設定することによ り行うことが可能です。
PDFファイルを生成するといったように送信するデータを保存するかどう かユーザにプロンプトを表示したい場合、推奨されるファイル名を指定 してブラウザに保存ダイアログを表示させるContent-Dispositionヘッダを使用可能で す。
<?php header("Content-type: application/pdf"); header("Content-Disposition: attachment; filename=downloaded.pdf"); /* ... PDFファイルを出力 ... */ |
注意 Microsoft Internet Explorer 4.01にはこれが動作しないというバグ があります。この解決策はありません。Microsoft Internet Explorer 5.5にもこれを妨げるバグがあります。これは、サービスパック2以降 とすることで修整可能です。
headers_sent(), setcookie()及び HTTP認証の節も参照下さ い。