PHPのheader関数でリダイレクト処理を行う方法【初心者向け】

プログラミング初心者向けにPHPのheader関数でリダイレクト処理を行う方法について解説しています。ログイン時などに別ページに飛ばしたい時やURLのIDを隠したい場合に便利なメソッドです。ぜひ書き方を覚えておきましょう。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

PHPプログラムのheader関数で別のページに移動させる方法やリダイレクトの使い方について解説します。

会員機能などがあるサービスでは、よくあるページにリダイレクトされるのを目にすることがあると思いますが、実際の開発でも役立つ知識なので、ぜひ覚えておきましょう。

そもそもPHPが何か分からない場合は、先にPHPとはの記事をご覧ください。

 

なお本記事は、TechAcademyのPHPオンライン講座の内容をもとにしています。

 

PHPのheader関数で別ページにリダイレクトする

header関数自体は、HTTPヘッダを送信する、という機能です。

簡単に言うと、ブラウザでアクセスしてくれた人に、情報を送ることが出来ます。

echoやprintなどの標準出力関数も似てますね。

echo("おはよう");

などとした場合、おはようが出力されると思いますが、PHPはサーバーサイドで実行されるプログラミング言語です。

ブラウザでアクセスした先のコンピュータ上で実行されて、ブラウザがあるコンピュータ側に、おはようと送信されます。

header関数だけが、HTTPヘッダを送信するわけではなく、PHPプログラミングがあれば、加工されてからHTTPヘッダとして送信されます。

 

header関数では、Locationと書いてから、飛び先のURLを書きます。

この際、httpから始まる絶対パスでも、.から始まる相対パスでもOKです。

別のページに飛びますので、処理を終了させてそれ以後の処理を行わないexit();という関数も書いておきましょう。

<?php
  header('Location: https://techacademy.jp/');
  exit;
?>

上記のサンプルでは、アクセスした瞬間に「https://techacademy.jp」へ移動します。

 

大石ゆかり

田島メンター!リダイレクトでは、外部のサイトでも自分のサイトの別のページでも移動させることが出来るんですか?

田島悠介

そうだよ。別のサイトやページに移動させることが出来るんだ。

大石ゆかり

どういう時に使うんでしょうか?アクセスした途端に、別のURLに飛ばされたら嫌ですね。

田島悠介

PHPによるリダイレクトなので、PHPに関わりがあるところが良いかな。実際の使用例を見てみよう!

 

別ページへ移動するリダイレクトの使い方

ページにアクセスすると、別のページへ移動させる方法なんてHTMLでもJavaScriptでもあるのにPHPのheader関数は必要なの?と思うかもしれません。

どんな時に使用されるのか見ていきましょう。

  1. ログイン時など
  2. アフィリエイトIDを隠したい場合

 

1. ログイン時

ログインが必要なページにアクセスした場合、未ログインならば、IDとパスワードの入力を促されるページにリダイレクトするなどで使用します。

PHPの中で、条件にしたがって使用するリダイレクトです。

 

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]");
  }
?>

まず実際にリダイレクトさせたいページのURLを配列に代入します。

このリダイレクト専用ページには、自分のURL/r.php?id=1のような感じでアクセスが来るので、GETがセットされていたら、変数に保存します。後は配列の添え字に指定して、リダイレクトさせます。配列ですので、数を増やしていくことも出来ます。

 

数が多くなれば、この方法は難しくなりますが40から50サイト分のURLなら管理できるはずです。

こうすることによって、「http://affiliate-test.com?my_affiliate_id=33」というサイトへリダイレクトさせることができます。

 

他の場所でこのURLを使う場合は

自分のURL/r.php?id=1

として使用することが出来ます。

 

大石ゆかり

ログインに成功したら、別のページに移動する。ほとんどのサイトがそうですよね。

田島悠介

そうだね。会員機能があるサイトだと、たいていマイページとかログインした人しか見られない管理画面に移動するよね。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

リダイレクト時に発生するエラーの対処方法

以下の書き方に注意しましょう。どんなエラーが起きているのか分からない場合は、ぜひ参考にしてみてください。

  1. header前に改行が入っている
  2. PHP開始前にスペースが入っている
  3. 先に出力されている
  4. utf-8にbom有りで保存されている

 

1. 改行が入っている

<?php
  //←改行が入ってしまっている。
  header('Location: http://techacademy.jp');
  exit;
?>

 

2. スペースが入っている

<?php
  //↑<?phpタグの前にスペースが入ってしまっている。
  header('Location: http://techacademy.jp');
  exit;
?>

?phpというのは、PHPプログラムが始まるところですから、その前に空白があるとHTMLが出力されたとみなされます。

 

3. 先に出力されている

<p>テックアカデミーに入会しよう</p>
<!--↑ header関数より前にHTMLコードが出力されてしまっている。-->
<?php
  header('Location: http://techacademy.jp');
  exit;
?>

すでにHTMLコードが出力されている状態です。この場合リダイレクトは失敗します。

 

4. BOM有りで保存されている

一部のテキストエディタでutf8で保存するとBOM有りで保存されます。

terapadなどでしたら、utf-8nで保存します。nはbom無しの意味です。

BOM有りで保存されると、ソースコード上では見つかりにくいですが、「BOM有りですよ」という情報が先頭に書かれた場合、ヘッダーが既に出力されているのでエラーになります。

 

おわりに

header関数を使ったリダイレクトの仕方、エラーの対処方法について解説しました。

様々なシーンで便利なので、ぜひ実際に書きながら理解していきましょう。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。

 

大石ゆかり

header関数は先に何か出力されていてはダメなんですか?

田島悠介

そうだね。絶対ダメってことはないけど、基本的にやめたほうがいいと思うよ。

大石ゆかり

なぜなんでしょうか?

田島悠介

データはある程度、たまってからブラウザに送信されるんだ。初回のデータ送信時にheader関数を書いたところが間に合っていれば、リダイレクト出来るんだけど、間に合わなかった場合、もうリダイレクト不可になるんだよね。

 

また、PHPを勉強していて、

  • もっと効率的に勉強したい
  • 誰かに聞きながら学びたい
  • 自分でWebサービスを作りたい

と思ったことはないでしょうか。

 

そんな方のために、TechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

独学に限界を感じている場合はご検討ください。