.NET開発者のためのブログメディア
PHPでのリダイレクト方法|簡単なソースコードやよくあるエラーについても紹介

- SE
- PHPでのリダイレクト方法と、よくあるエラーやミスなどについて改めて教えていただけますか。
- PM
- サイト制作でもシステム開発でも使用する場面の多い処理ですので、PHPでのリダイレクト方法やエラーやミスなどについて解説いたしましょう。
目次
リダイレクト(転送)を使う場面
システムやサイトを作成していると、別のページに強制的に移動させたくなる時がよくあります。例えば、システムへのログイン失敗時に別のページに強制移動したり、公開していたページを非公開にした際に、アクセスできないようにする時などです。
特に、ページを非公開にする時、直接ページを撤去してもいいですが、その場合404、403エラーが表示されてしまうことがよくあり、Google検索やブックマークからアクセスしてきた訪問者を混乱させてしまいます。
このような場合にページをリダイレクトすることで、訪問者を正しいページに移動させると便利です。他の言語でもリダイレクトすることができますが、今回は、PHPでのリダイレクト方法を紹介します。
PHPでのリダイレクトの実装方法
PHPでリダイレクトをする場合は、該当ページの先頭でheader関数を使用して行います。
以下のような、簡単なソースコードで実装することができます。
1
2
3
4
5
|
<?php
/* リダイレクトさせたい時は、このように記述します。 */
header('Location: http://www.example.com/');
exit;
?>
|
header関数を実行した後、最後にexit;でその後の処理を終了させます。
HTTPヘッダーとheader関数
header関数は、PHPでHTTPヘッダーを送信する際に使われる関数です。
HTTPヘッダーとは、ブラウザ(クライアント)とサイト(サーバー)間で情報通信を行う際のルール(プロトコル)にのっとって作られるページの制御情報で、「このページをみたい」「このページはPOSTで通信する」などのデータや命令が書かれています。
そのためページを表示しようとする時は、ページ上の掲載文字やコンテンツを読み込み始める前に、まずHTTPヘッダー情報が作られます。
通常、PHPで作成したページは自動的にWEBページとして読み込まれ表示されますが、このHTTPヘッダーの設定を変えると、ページ読み込みではなく、アクセスした直後にファイルダウンロードさせることも可能です。
これと同じ考え方で、PHPページのHTTPヘッダーをheader関数を用いて設定することで、「指定URLにリダイレクトさせる」ことができるようになります。
PHPでページをリダイレクトさせる上で必ず覚えておく必要はありませんが、予備知識として知っておくと、後で役に立つこともありますのでぜひ覚えておくことをオススメします。
リダイレクトさせる上での注意点
header関数を使っているため、以下のような点に注意して実装する必要があります。
使い方を誤ると、エラーの原因になります。
header関数の前に、文字や空白、改行を含んでいる
header関数を使用している行の前に、echoやprint関数による文字列の表示箇所があると、リダイレクトの実行時にエラーとなります。
1
2
3
4
5
6
|
<?php
echo 'hogehoge';
/* このリダイレクトはエラーとなります。 */
header('Location: http://www.example.com/');
exit;
?>
|
その際に表示されるエラーは以下のようなものになります。
1
2
|
Warning:Cannotmodifyheaderinformation-headersalreadysentby(outputstartedat…
|
文字が先に表示され、HTTPヘッダー情報がすでに送信されてしまったため、header関数を実行した時点でHTTPヘッダー情報を調整することはできない、とのエラーです。
また、header関数を含んでいるPHP開始タグより前のhtml上で、文字列、空白、改行の表示やhtmlタグの掲載箇所がある場合にもエラーとなります。
1
2
3
4
5
6
|
<html>
<?php
/* このリダイレクトはエラーとなります。 */
header('Location: http://www.example.com/');
exit;
?>
|
header関数の前に、includeやrequireしている部分がある
これもよく頻発するケースですが、header関数の前にincludeやrequire関数を使用していると、上記と同様のエラーが発生する場合があります。
原因は、includeやrequireしている外部ファイルの中で、文字列や空白を表示している部分があり、それがheader関数が処理されるより前に実行されてしまうためです。
1
2
3
4
5
6
|
<?php
include('hogehoge.php');
/* このリダイレクトはエラーとなります。 */
header('Location: http://www.example.com/');
exit;
?>
|
「Location:」の部分の記述
もう一点、細かいところで陥りやすいのが、「Location:」の記述です。以下のように「Location」と「:(コロン)」の記述との間に空白があると、エラーになります。
1
2
3
4
5
|
<?php
/* このリダイレクトはエラーとなります。 */
header('Location : http://www.example.com/');
exit;
?>
|
正しいコードなのにエラーになる
上記のようなミスもなく、正しいコーディングを行っているにもかかわらずエラーになる場合は、PHPファイルの保存時に文字コードがUTF-8で「BOMあり」保存していることがあります。
「BOMあり」で保存した場合、ページ上は見えない「0xEF 0xBB 0xBF」というデータがページの最初に自動追加されてしまい、PHPを実行した時エラーになります。
TeraPadやメモ帳などのテキストエディタでは、「BOMあり」を選択することができてしまうため、もし「BOMあり」で保存されている時は、「名前を付けて保存」や「設定」「プロパティ」を選択して、「BOMなし」で保存しなおすようにしましょう。
header関数の引数について
header関数には、転送先のURL以外にも引数を2つ設定することができます。リダイレクトを行う際には、3つ目の引数を設定した方がよい場合がほとんどですので、覚えておきましょう。
1
|
header('Location: http://www.example.com/', true, 301);
|
第2引数:true または false(Boolean型)
trueにすると、以前送信されたHTTPヘッダーを置換します。falseにすると、HTTPヘッダーがすでにあっても強制的に同じ型のヘッダーを追加作成します。
デフォルト設定(引数を何も指定しない状態)では、この設定はtrue(置換)として処理されます。この2つ目の引数は、基本的にtrueを使うことがほとんどです。
第3引数:HTTPレスポンスコード(ステータスコード)
HTTPヘッダーレスポンスコードというものを設定します。
これはheader関数を使用した時に、そのリダイレクト処理の意味合いを付加するなどのために用意してあります。
以下のような第1引数のみのリダイレクトの場合、HTTPヘッダーレスポンスコードはデフォルトで「302」が割り当てられますが、これは「一時的な転送(リダイレクト)」という意味の情報として受け取られます。
1
|
header('Location: http://www.example.com/');
|
302でのリダイレクトを行うと、Googleは一時的な転送とみなし、転送設定を無視するため、検索結果にも反映されません。
一方以下のように、第3引数を「301」に設定すると、そのリダイレクトは「恒久的な転送」として認識され、Google検索結果にも転送情報が反映されるようになります。
1
|
header('Location: http://www.example.com/', true, 301);
|
header関数でリダイレクトを使用するのは、一時的にページを閉鎖・再公開する場合などを除いて「恒久的な転送」を利用することが多いので、基本的に「301」を設定するように心がけるとよいでしょう。
- SE
- PHPでのリダイレクトの方法にも記載上のルールや様々な設定などについてよく分かりました。
- PM
- 今回解説した内容を理解して、活用してください。
PHPでリダイレクト まとめ
今回はPHPでのリダイレクト方法について紹介しました。単にリダイレクトするだけでも記載上のルールがあったり様々な設定などがあったりと、細かい注意点があります。
リダイレクトそのものは初級的な機能ですが、多くの場面で使うことがある上、プロのコーダーの方でも、たまにうっかりミスをしてしまう箇所ですので、しっかり注意してコーディングしていきましょう。
Search キーワード検索
Popular 人気の記事
-
【VB.NET入門】DataGridViewの使い方まとめ
公開: 更新:
reccomended おすすめ記事
-
【.NETが統合】.NET 5の概要と今後のリリース予定
公開: 更新:
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)