PHPのheader関数でリダイレクト処理を行う方法【初心者向け】
プログラミング初心者向けにPHPのheader関数でリダイレクト処理を行う方法について解説しています。ログイン時などに別ページに飛ばしたい時やURLのIDを隠したい場合に便利なメソッドです。ぜひ書き方を覚えておきましょう。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
PHPプログラムのheader関数で別のページに移動させる方法やリダイレクトの使い方について解説します。
会員機能などがあるサービスでは、よくあるページにリダイレクトされるのを目にすることがあると思いますが、実際の開発でも役立つ知識なので、ぜひ覚えておきましょう。
目次
PHPのheader関数で別ページにリダイレクトする
header関数自体は、HTTPヘッダを送信する、という機能です。
簡単に言うと、ブラウザでアクセスしてくれた人に、情報を送ることができます。
echoやprintなどの標準出力関数も似てますね。
echo("おはよう");
上記とした場合、おはようが出力されると思いますが、PHPはサーバサイドで実行されるプログラミング言語です。
ブラウザでアクセスした先のコンピュータ上で実行されて、ブラウザがあるコンピュータ側に、おはようと送信されます。
header関数だけが、HTTPヘッダを送信するわけではなく、PHPプログラミングがあれば、加工されてからHTTPヘッダとして送信されます。
サンプルコード
<?php
header('Location: https://techacademy.jp/');
解説
1行目の<?php
では、このプログラムがPHPプログラムであることを意味します。
2行目のheader('Location: https://techacademy.jp/');
では、header関数を利用して、techacademy.jp
という位置をLocation
と指定して、移動する処理を実装しています。
この際、http
から始まる絶対パスでも、.
から始まる相対パスでもOKです。
今回は、アクセスした瞬間に「https://techacademy.jp」へ移動します。
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
別ページへ移動するリダイレクトの使い方
ページにアクセスすると、別のページへ移動させる方法なんてHTMLでもJavaScriptでもあるのに、PHPのheader関数は必要なの?と思うかもしれません。
どんな時に使用されるのか見ていきましょう。
- ログイン時
- アフィリエイトIDなどを隠したい場合
1. ログイン時
ログインが必要なページにアクセスした場合、未ログインならば、IDとパスワードの入力を促されるページにリダイレクトするなどで使用します。
PHPの中で、条件にしたがって使用するリダイレクトです。
サンプルコード
<?php
$user='';
if(!$user){
header('Location: https://techacademy.jp/');
}
解説
1行目の<?php
では、このプログラムがPHPプログラムであることを意味します。
2行目の$user='';
では今回サンプルプログラムを動作させるために、ユーザーがログインしていない状態を想定して、変数$user
を空っぽの状態にしています。
3行目のif(!$user){
では、変数$user
に値が入っていなければという条件式を実装しています。
変数の前に!
を記載しているのは否定演算子です。
つまり、変数$user
を否定することで、変数$user
の値がない場合という条件を作成しています。
PHPのif文に関しては次の記事を参考にしてみてください。
PHPで条件分岐(if文)を使う方法【初心者向け】 | TechAcademyマガジン
4行目のheader('Location: https://techacademy.jp/');
では、header関数を利用して、ユーザーがログインしていない場合にこのページが表示された瞬間、Locationで指定したhttps://techacademy.jp/
に移動する処理を実装しています。
2. アフィリエイトIDなどを隠したい場合
アフィリエイトIDなどを隠したい場合に使用します。
専用のリダイレクトページを用意して、header関数でリダイレクトさせることによって、アフィリエイトIDを表示させずに移動してもらうことができます。
例えば、自分のURL上に、r.php
を用意しておきます。
専用のリダイレクトプログラムです。
また、別のページにある広告のリンク先を自分のURL/r.php?id=1
などとしておきます。
広告のリンクの飛び先を、リダイレクトページに指定しておいて、リダイレクトページにて実際に飛ばしたいページへ移動させます。
サンプルコード
<?php
$redirect[1] = "http://affiliate-test.com?my_affiliate_id=33";
if( isset($_GET['id']) ){
$id = intval($_GET['id']);
header("Location:$redirect[$id]");
}
解説
1行目の<?php
では、このプログラムがPHPプログラムであることを意味します。
2行目の$redirect[1] = "http://affiliate-test.com?my_affiliate_id=33";
では、配列のindex
が1の位置に、http://affiliate-test.com?my_affiliate_id=33
というアフィリエイトIDが含まれたURLを代入しています。
3行目のif( isset($_GET['id']) ){
では、$_GET['id']
に値が入っていればif文の処理を実行するという条件文です。
issetに関してはこちらの記事を参考にしていただくと良いですよ。
PHPのisset関数で変数が存在するか確認する方法 | TechAcademyマガジン
4行目の$id = intval($_GET['id']);
では、$_GET['id']
に格納されている値をintval関数で整数に変換し、変数$id
に代入しています。
5行目のheader("Location:$redirect[$id]");
では、4行目で用意した数値を利用してリダイレクト先のURLに移動します。
今回は2行目でURLが1つだけ用意されていると思います。
$id
が1であれば、header("Location:$redirect[$id]");
は、結果的に、2行目の$redirect[1]
の状態になります。
そうなると、2行目のhttp://affiliate-test.com?my_affiliate_id=33
というURLをLocation
で指定して、header関数を利用して移動することができます。
もし、$id
が1以外の場合は、移動先のLocation
が正しく指定できないため移動しません。
今回のコードであれば、次のようにいくつかの配列に各URLを指定しておくことで、$id
の値に応じて移動する機能を利用することができます。
$redirect[1] = "http://affiliate-test.com?my_affiliate_id=33";
$redirect[2] = "http://affiliate-test.com?my_affiliate_id=44";
$redirect[3] = "http://affiliate-test.com?my_affiliate_id=55";
$redirect[4] = "http://affiliate-test.com?my_affiliate_id=66";
$redirect[5] = "http://affiliate-test.com?my_affiliate_id=77";
たとえば、$id
が5の場合は、http://affiliate-test.com?my_affiliate_id=77
に移動します。
ログインに成功したら、別のページに移動する。ほとんどのサイトがそうですよね。
そうだね。会員機能があるサイトだと、たいていマイページとかログインした人しか見られない管理画面に移動するよね。
リダイレクト時に発生するエラーの対処方法
以下の書き方に注意しましょう。
どんなエラーが起きているのか分からない場合は、ぜひ参考にしてみてください。
header
前に改行が入っている- PHP開始前にスペースが入っている
utf-8
にBOM
有りで保存されている
1. header前に改行が入っている
サンプルコード
<?php
//←改行が入ってしまっている。
header('Location: http://techacademy.jp');
exit;
表示結果
解説
2行目に改行が入っているためエラーになります。
3行目のexit()関数は処理を終了させる関数です。
今回の処理の場合、実装してあってもなくても、結果的には同じ動きになります。
2. PHP開始前にスペースが入っている
サンプルコード
<?php
//↑<?phpタグの前にスペースが入ってしまっている。
header('Location: http://techacademy.jp');
表示結果
解説
<?php
というのは、PHPプログラムが始まるところですから、その前に空白があるとエラーになります。
3. utf-8にBOM有りで保存されている
一部のテキストエディタでutf8
で保存するとBOM有りで保存されます。
TeraPadなどでしたら、utf-8n
で保存します。
n
はBOM無しの意味です。
BOM有りで保存されると、ソースコード上では見つかりにくいですが、「BOM有りですよ」という情報が先頭に書かれた場合、ヘッダーが既に出力されているのでエラーになります。
このような状態を回避するためには、テキストエディタではなく、Visual Studio CodeのようなIDEを利用していただくと良いです。
Visual Studio Codeについてはこちらの記事を参考にしてみてくださいね。
Visual Studio Codeとは?インストールや使い方も現役エンジニアが解説 | TechAcademyマガジン
おわりに
header関数を使ったリダイレクトの仕方、エラーの対処方法について解説しました。
様々なシーンで便利なので、ぜひ実際に書きながら理解していきましょう。
header関数は先に何か出力されていてはダメなんですか?
そうだね。絶対ダメってことはないけど、基本的にやめたほうがいいと思うよ。
なぜなんでしょうか?
データはある程度たまってから、ブラウザに送信されるんだ。初回のデータ送信時にheader関数を書いたところが間に合っていればリダイレクトできるんだけど、間に合わなかった場合、もうリダイレクト不可になるんだよね。
執筆してくれたメンター
中本賢吾(なかもとけんご) アジマッチ有限会社 代表取締役社長開発実績:PHPフレームワークによるフランチャイズ企業向け会員制SNS。Shopifyによる海外進出用大規模ネットショップ構築。Vue.jsによる金融機関向け内部アプリ。AWSやLinuxハウジングサーバでの環境構築。人工知能を利用した画像判別システム。小売チェーン店舗用スマホアプリ。Wordpressによる不動産チェーン店向け賃貸・売買仲介システム。基幹システム移管用データコンバートシステム。小学生がオリジナルAndroidアプリをGoogle Playでリリース、NHK Whyプログラミング入賞、全国Programing Festival入賞、中学生がSNS型PWAアプリリリースなど、ボランティアプログラミング教育活動行っている。 |
テックアカデミーでは、初心者でもPHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。
挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。