Web aym.pekori.to

header

(PHP 3, PHP 4, PHP 5)

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

説明

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

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

注意: PHP 4.4.2 および PHP 5.1.2 以降、この関数は一度に複数のヘッダを 送信できないようになりました。これは、 ヘッダインジェクション攻撃への対策です。

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

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

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

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

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

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

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

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

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

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

<?php
/* カレントディレクトリの別のページにリダイレクトします */
$host  = $_SERVER['HTTP_HOST'];
$uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$extra = 'mypage.php';
header("Location: http://$host$uri/$extra");
exit;
?>

注意: session.use_trans_sid が有効であったとしても、セッション ID が Location ヘッダとともに 渡されることはありません。SID 定数を使用して 手動で渡す必要があります。

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

<?php
header
("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 過去の日付
?>

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

加えて、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 認証 の節も参照ください。