PHPのheader関数でリダイレクトを行う方法。エラーの対処法も紹介

今回はPHPのheader関数を使ってリダイレクト処理を行う方法を紹介します。

処理自体は難しくないので心配しないでください。

 

PHPのheader関数でリダイレクトをする方法

header関数はHTTPヘッダを送信する関数です。ブラウザにアクセスしてくれた人に情報を送ることができるわけですね。

header関数を使ってリダイレクトをするにはLocationを指定し、リダイレクト先のURLを記述します。

URLはhttpから始まる絶対パスでも、「./」から始まる相対パスでも構いません。

また、別ページに飛ぶことになるので別の処理を行わないようexit()でスクリプトを終了させておきましょう。

<?php
  header('Location: https://knoweb.net/');
  exit;
?>

 

このように書くと、あるページにアクセスした瞬間にknoweb.netにリダイレクトされます。

 

リダイレクトを使う場面

別ページに移動させるだけならHTMLやJavaScriptでも実装可能ですが、わざわざPHPによるリダイレクトを使う場面はどのような場合でしょうか?

PHPによるリダイレクトを行う場合は以下のような時です。

  • ログイン時など
  • アフィリエイトIDを隠したい時

 

ログイン時

通常ページにアクセスするところを、ログインされていない場合はログインを促すページにリダイレクトする場合などに使用されます。

ログイン時はそのまま通常のページに、セッションが切れていた場合はログインを促すページにリダイレクトさせるという感じです。

 

アフィリエイトIDを隠したい時

PHPによるリダイレクトはアフィリエイトIDを隠したい場合に使用することもあります。

専用のリダイレクトページをあらかじめ用意しておき、header関数でリダイレクトさせることでアフィリエイトIDを表示させずに移動させることができます。

 

実際にやる場合はリダイレクト専用のファイル「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が設定されていたらそれを変数に格納します。

あとはリダイレクトページのURLと$_GETの情報を指定してリダイレクトさせるだけです。

配列形式で格納しているので、情報が増えても対応できます。

 

リダイレクトを行う場合の注意点

リダイレクト処理を行う場合は本当にちょっとしたことでエラーになったりします。

確認すべき点は以下の4つです。

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

 

header前に余分な改行が入っている

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

 

header関数の前に改行を入れるとエラーになります。

余分な改行入れず、詰めて書くようにしてください。

 

PHP開始前に余分なスペースが入っている

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

 

「<?php」の後ろにスペースが入っているとこれもエラーになります。

やりがちですが、リダイレクトする際は<?php の後ろにはスペースを入れないでください。

 

先にHTMLが出力されている

<p>こんにちは!</p>
<!--↑ header関数より前にHTMLコードが出力されてしまっている。-->
<?php
  header('Location: http://techacademy.jp');
  exit;
?>

 

リダイレクト処理より前にHTMLを出力しないでください。

この場合リダイレクトは失敗します。

 

BOMありで保存されている

テキストエディタによってはBOMありで保存されることがあります。

BOMありで保存するとヘッダーがすでに出力されていることになるので、リダイレクトはエラーになります。

保存するときはBOMなしで保存するのがいいでしょう。

 

まとめ

PHPでリダイレクト処理を行う方法と、想定されるエラーについて紹介しました。

一通り概要がわかったら自分でコードを書いてみるのもいいですね。

プログラミング上達には自分でコードを書いてみることが不可欠です。

ぜひやってみてください。