【PHP】header関数を使ってリダイレクトする方法を解説!
“header()関数は、HTTPヘッダーをクライアントに送信します。
使用用途は、ログインしていないユーザーがアクセスしてきた場合にTOPぺージにリダイレクトさせたい時や、ファイルをダウンロードさせたい場合です。
この記事では、header()関数を使ってリダイレクトさせる方法とファイルをダウンロードさせる方法、使用上の注意を解説していきます。
また、出力を送信する前にheader()関数を呼び出す必要があることに注意してください。
header関数の書き方
header関数の構文は以下のようになります。
1 2 3 |
<?php header ( $ヘッダ文字列 [, bool $replace = true [, int $http_response_code ]] ); ?> |
パラメータ
パラメータは以下のようになります。
・ $ヘッダ文字列
特殊な header コールが 2 種類あります。最初のものは、 文字列 http/ から始まる全てのヘッダです。大文字・小文字は区別されません。
このヘッダは、送信する HTTPステータスコードを示すために使用されます。
例えば、存在しないファイルへのリクエストを処理するためにあるPHPスクリプトを使用するよう(ErrorDocument ディレクティブにより)Apacheを設定する場合、そのスクリプトが正しいステータスコードを返すようにする必要があります。
1 2 3 |
<?php header("HTTP/1.0 404 Not Found"); ?> |
2番目の特別なヘッダは、Location: ヘッダです。このヘッダがブラウザに返されるだけではなく、ブラウザにREDIRECT(302)ステータスコードを返します。
しかし、201や3xxのステータスコードが既に送信されていない場合にのみになります。
1 2 3 4 |
<?php header("Location: http://localhost.com/"); exit(); ?> |
デフォルトでは、この関数は 置換を行ないますが、二番目の引数にfalseを指定すると、同じ型の複数のヘッダを強制的に生成します。例えば、
・$replace
ヘッダが 前に送信された類似のヘッダを置換するか、または、同じ形式の二番目のヘッダを追加するかどうかを指定します。
デフォルトでは、この関数は置換を行ないますが、二番目の引数にfalseを指定すると、同じ型の複数のヘッダを強制的に生成します。
例えば、
1 2 3 4 |
<?php header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM', false); ?> |
このように、前回送信されたヘッダが指定された場合に、値を置換するかどうかを指定します。
1 2 3 |
<?php header("HTTP/1.0 404 Not Found"); ?> |
・$http_response_code
HTTP レスポンスコードを強制的に指定の値にします。
このパラメータが意味をなすのは header が空文字列でないときだけであることに注意しましょう。
返り値
値を返しません。
header関数の使い方
header関数は、HTTPによるリクエストや、レスポンスのやりとりをするときにHTTPヘッダの内容を指定することができます。
そもそもHTTPヘッダとは、リクエスト(要求)→ レスポンス(応答)と言う流れがあり、欲しい情報を依頼(リクエスト)し、どのようなコンテンツを受け取る(レスポンスする)かを定義するためのものとなります。
ですので冒頭でも言いましたが、header関数はログインしてない場合にログイページにリダイレクトさせたり、ファイルをダウンロードしたりする時に使われます。
リダイレクトさせる方法
指定したページにリダイレクトするには、引数に「Location: url」の形式で指定します。
試しにフライテックのページにリダイレクトしてみましょう。
例
1 2 3 4 5 6 7 8 |
<?php header('Location: https://flytech.work'); exit(); ?> |
これにより、ヘッダーの場所が変更されます。つまり、フライテックのホーム画面にリダイレクトされます。
リダイレクトする時は、以降のコードが実行されないようにexit()を指定して処理を終了しましょう。
ファイルをダウンロードする方法
ファイルをダウンロードするにはまず、Content-Typeにパスを指定し、Content-Lengthにはファイルサイズを指定します。
そして、Content-Dispositionでダウンロードしたい名前に設定すると、その名前でダウンロードされます。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php //ダウンロードをしたいファイル名のパス $name = 'aaaa.php' $path = dirname(__File_).'/'.$file_name; //ダウンロード時のファイル名 $download_name = 'download.php'; //タイプをダウンロードと指定 header('Content-Type: application/force-download;'); //ファイルのサイズを取得してダウンロード時間を表示する header('Content-Length: '.filesize($path)); //ダウンロードの指示・ダウンロード時のファイル名を指定 header('Content-Disposition: attachment; filename="'.$name.'"'); //ファイルを読み込んでダウンロード readfile($download_name); ?> |
phpファイルを実行すると、指定したパスに存在する指定したファイルをダウンロードすることができます。
header関数を使用する場合の注意点
header関数を使用する上で注意点が6つあります。
注意1:
ヘッダにアクセスできたりヘッダを出力したりするのは、それに対応したSAPIを使っている場合のみとなります。
注意2:
出力のバッファリングを使用してこの問題を回避することができます。
この場合、ブラウザへの出力が送信するまでサーバーに 全てバッファリングされるオーバーヘッドがあります。
出力バッファリングは、ob_start() と ob_end_flush()をスクリプトでコールするかphp.iniまたはサーバー設定ファイルの設定ディレクティブ output_bufferingを設定することにより行うことが可能です。
注意3:
実際に header() が最初にコールされたかどうかにかかわらず、HTTP ステータスヘッダ行は クライアントに対し常に最初に送信されます。
HTTPヘッダが既に送信されていない限り、header() をコールすることでステータスは常に上書きされます。
注意4:
Microsoft Internet Explorer 4.01 にはバグがあり、これを解決する方法はありません。
同様に Microsoft Internet Explorer 5.5にもこれを妨げるバグがあります。
こちらは、サービスパック2以降にアップグレードすることで対応できます。
注意5:
セーフモードが有効な場合は、 WWW-Authenticate ヘッダ (HTTP 認証に使用する) を設定した際に、スクリプトの uid が realm 部に追加されます。
注意6:
最近のクライアントの大半は » Location: への引数として相対 URI も受け付けますが、 古いクライアントの中にはスキームとホスト名そして絶対パスを含む絶対URLしか受け付けないものもあります。
通常は、相対 URI から絶対 URI を作成するためには
$_SERVER[‘HTTP_HOST’]、 $_SERVER[‘PHP_SELF’] および dirname() を使用できます。
例
1 2 3 4 5 6 7 8 |
<?php /* カレントディレクトリの別のページにリダイレクトします */ $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'localpage.php'; header("Location: http://$host$uri/$extra"); exit(); ?> |
ST
株式会社flyhawkのSTです。フライテックメディア事業部でのメディア運営・ライター業務なども担当。愛機はMac Book AirとThinkPad。好きな言語:swift、JS系(Node.js等)。好きなサーバー:AWS。受託開発やプログラミングスクールの運営をしております。ご気軽にお問い合わせください。