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

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

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

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」へ移動します。

 

 

大石ゆかり
田島メンター!リダイレクトでは、外部のサイトでも自分のサイトの別のページでも移動させることができるんですか?
田島悠介
そうだよ。別のサイトやページに移動させることができるんだ。
大石ゆかり
どういう時に使うんでしょうか?アクセスした途端に、別のURLに飛ばされたら嫌ですね。
田島悠介
PHPによるリダイレクトなので、PHPに関わりがあるところが良いかな。実際の使用例を見てみよう!

 

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

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

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

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

  1. ログイン時
  2. アフィリエイト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に移動します。

 

大石ゆかり

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

田島悠介

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

 

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

以下の書き方に注意しましょう。

どんなエラーが起きているのか分からない場合は、ぜひ参考にしてみてください。

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

 

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講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。