PHPでリダイレクトを実装したいけれど、「正しい書き方がわからない」「エラーが出る」「POSTデータが消えてしまう」など悩んでいませんか?
本記事では、header("Location:")の基本構文から、条件分岐によるページ遷移、SEOやセキュリティへの影響、エラー対策まで、PHPリダイレクトの仕組みと使い方を丁寧に解説します。初心者の方からPHP経験者まで幅広くターゲットにしていますので、ぜひ参考にしてください。
目次
閉じる
1.PHPでリダイレクト処理を行う目的とは?
PHPでリダイレクト処理は、ユーザーの行動に応じて自動的にページを切り替える重要な手段です。ここでは具体的な活用場面を紹介して、PHPでリダイレクト処理をする目的を解説します。
ユーザー操作に応じてページを自動遷移させるため
Webアプリケーションでは、ログイン完了後にマイページへ転送したり、フォーム送信後にサンクスページへ案内したりすることがあります。こうした遷移をスムーズに実現するために、PHPのリダイレクト処理が欠かせません。ユーザーが余計な操作をしなくても済むよう導線を整えることは、使いやすいWebサイト構築のために重要です。
フォーム再送信の防止や二重送信の回避
フォームの送信処理後にページをそのまま表示していると、ユーザーが、戻るボタンをクリックしたり、再読み込みをしたりしてしまうと、同じ処理が繰り返されて不都合が生じてしまうおそれがあります。そのような問題を回避するために、リダイレクトを間に挟むと、重複送信のリスクを低減することが可能です。「Post/Redirect/Get(PRG)パターン」と呼ばれ活用されています。
セキュリティ対策とアクセス制御のため
ログインしていないユーザーのアクセスを制限するためにもリダイレクトは活用されます。たとえば、管理画面に直接アクセスしようとした場合、ログインしていなければ自動的にログインページへ移動させることで、不正な操作を防げます。
ページ構成やサイト構造の整理とSEO対策
URLの構成変更やページ移動を行うときには、旧ページから新ページへ転送しなければいけません。PHPでは301リダイレクトを設定すれば、ユーザーに混乱を与えず、検索エンジンにも正しい構造を伝えることが可能です。SEOの観点でも、適切なリダイレクト処理が検索順位の維持・改善に効果をもたらすといわれています。
2.PHPにおけるリダイレクト処理の基本
PHPでリダイレクトを実装するには、HTTPレスポンスヘッダーを活用しましょう。ここでは、PHPにおけるリダイレクト処理の基本について、構文や注意点などを解説します。初心者の方はよく理解してください。
header("Location: URL")の使い方
PHPでリダイレクトさせてページを転送する基本的な方法は、header関数を使ってブラウザにHTTPヘッダーを送信することです。
header("Location: https://example.com/"); exit; |
このコード例では、ブラウザに対して「このページは別のURLに移動してください」という指示を送っています。その指示の結果、ブラウザでは自動的に指定されたURLへ遷移されるのです。
転送先のURLは、スラッシュやクエリ文字列を含む完全なパスで指定してください。省略したり不正なURLを指定してしまうと、意図しない動作を引き起こしてしまうので注意してください。
header関数の後はexitをつけましょう
header関数を使ってリダイレクトをするときは、exitを直後に記述するのが基本です。
header("Location: https://example.com/"); exit; |
header関数の直後にexitを書くのは、リダイレクト後にPHPスクリプトの処理が続いてしまうのを防ぐためです。もしexitを書かずにスクリプトが継続すると、想定外のデータ送信やログ出力が行われてしまうおそれがあります。
特にフォーム送信後の処理やセッションの更新処理などの場合には、リダイレクトを使ったあとは、必ずスクリプトを終了させることを忘れないようにしましょう。
HTML出力前にheaderを使ってはいけません
PHPではHTTPヘッダーを送信する前に、HTMLや空白、改行など何らかの出力が行われていると、header関数は動作しません。そのため、次のようなコードは書いてはいけません。
<!DOCTYPE html> <html> <head><title>Test</title></head> <body> <?php header("Location: https://example.com/"); exit; ?> </body> </html> |
このコード例では、 header関数よりも先にHTMLが出力されてるので、「headers already sent」というエラーが発生します。対策としては、PHPファイルの最上部でリダイレクト処理を記述する、もしくはob_start関数を使って出力バッファリングするようにしてください。
PHPでリダイレクト先指定における相対パスと絶対パスの違い
header("Location:")で指定するURLは、絶対パスと相対パスどちらでも有効です。
絶対パスの例
header("Location: https://example.com/dashboard.php"); |
絶対パスはURLをフルで指定するため、どのページから呼び出しても確実に目的のURLへリダイレクトされます。ドメインをまたぐ場合やSEO対策を考慮しなければいならない場合に適しているでしょう。
相対パスの例
header("Location: ./mypage.php"); |
現在のファイル位置を基準に遷移先を指定します。サーバー内の移動であれば簡単に書けますが、URL構造や階層を正しく把握していないと、意図しないページに移動してしまうので注意しなければなりません。相対パスの指定は誤解も生まれやすいため、特に初心者は絶対パスを使うのをおすすめします。
関連記事
PHPのheader関数を完全解説!リダイレクト・Content-Type・エラー対策まで
3.PHPでリダイレクトの条件分岐を実装する方法
PHPでリダイレクトをさせたい場合、条件分岐を実装したいケースもあるでしょう。ここでは、条件に応じてリダイレクト先を切り替える方法を紹介します。
ログイン状態に応じたページ振り分け
よく使われる条件分岐はログイン状態によるリダイレクトです。たとえば、ログインしていないユーザーをログインページに転送したい場合は、次のコード例を参考にしてください。
session_start();
header("Location: login.php"); exit; } |
このコード例ではセッション情報をチェックして条件分岐させているため、認証済みのユーザーだけが本来のページへアクセスできます。ログインページそのものでは、このチェックを除外するようにしてください。
逆に、すでにログインしているユーザーが再度ログインページへアクセスしようとした場合、マイページへリダイレクトさせるとユーザーにとって使いやすいサイトになります。ぜひ参考にしてください。
フォームの入力内容によってリダイレクト先を変える
フォームに入力された内容に応じて、遷移先のページを切り替えるパターンもあります。たとえば、選択されたプランや申込種別によって別の確認ページへ移動させたい場合、次のコード例を参考にしてください。
$plan = $_POST['plan'] ?? '';
header("Location: confirm_basic.php"); exit; } elseif ($plan === 'premium') { header("Location: confirm_premium.php"); exit; } else { header("Location: error.php"); exit; } |
このコード例では、フォームのPOSTデータをもとに条件分岐させて、それぞれの確認ページやエラーページへリダイレクトさせることが可能です。
なお、複数条件に対応したい場合は if-elseif構文を使い、条件が多い場合にはswitch文を使うと見やすくわかりやすいコードになるはずです。
PHPでリダイレクトさせるときに条件分岐することは、ユーザーごとの処理フローを制御するうえで欠かせない方法なので、適切な条件分岐を実装しましょう。
4.PHPにおけるリダイレクトエラーと回避方法
PHPでリダイレクト処理を使う場合、うまく動作しないこともあります。ここでは、よくあるエラーと、その原因と回避方法を解説します。
「headers already sent」とは?エラーの原因
PHPでリダイレクト処理を実装していると、次のエラーメッセージが表示されることがあります。
Warning: Cannot modify header information - headers already sent by... |
このエラーメッセージは「ヘッダーはすでに送信されている」という意味で、header関数が正しく動かない状態です。原因はPHPで書いたコードで、ヘッダー送信よりも前にecho文・空白・改行などの出力が行われていることです。
回避方法としては、PHPスクリプトの最上部で headerを実行するか、ファイルの先頭や末尾に空白や改行を入れないことを徹底することです。
ob_startを使った回避方法
出力前にリダイレクト処理を確実に行いたい場合、出力バッファリング(Output Buffering) を使う方法があります。PHPではob_start関数をコードの冒頭に記述することで、実際の出力を一時的にメモリに蓄積し、header関数を機能させることが可能です。
ob_start();
exit;
|
このコード例ではヘッダー送信の直前に出力があっても、バッファに保持されているためエラーになりません。ただし、バッファリングに頼りすぎると、問題が見えづらくなることもあるため、 出力より前にヘッダー処理をさせることが基本だと理解してください。
BOMや文字コードの注意点
リダイレクト処理がなぜか動作しないとか、ヘッダー送信前の出力もないのに「headers already sent」エラーが出る場合には、BOM(Byte Order Mark) や文字コードの影響を疑ってみましょう。
BOMとはUTF-8ファイルの先頭に付加される特殊なバイト列で、エディタによっては自動的に挿入されることがあります。BOMが存在すると、PHPがそれを出力とみなしてしまい、header関数の実行時にエラーを引き起こします。
この問題を回避するためには、ファイルの文字コードを BOMがないUTF-8に設定するとか、VSCodeやPHPStormなどのエディタを使ってBOMを無効にするなどやってみてください。
5.PHPでリダイレクトさせるheader以外の実装方法
PHPでリダイレクトさせる場合にはheader関数を使うのが一般的ですが、状況によっては他の手段を選ぶこともあります。ここでは、PHPでリダイレクトを実装する場合に、header以外の方法として使われるmetaタグやJavaScriptを使ったリダイレクトについて解説します。
HTMLの「meta refresh」を使ってリダイレクトさせる方法
HTML内でページ遷移を実現したい場合には、<meta>タグを使ったリダイレクトが便利です。特に、HTML出力が始まった後ではPHPの header関数が使えないため、代替手段として活用されます。
<meta http-equiv="refresh" content="3;url=thanks.html"> |
このコード例は、「3秒後にthanks.htmlへ遷移する」という意味です。ユーザーに一時的なメッセージを表示した後で別ページに移動させたい場合などに適しています。
ただしSEOの観点では header("Location:") や301リダイレクトの方がおすすめです。初心者の方はPHPでheader関数を使ってみてください。
JavaScriptで「location.href」を使う方法
クライアントサイドで制御を行いたい場合は、JavaScriptによるリダイレクトを使ってみましょう。location.hrefプロパティを使えば、ブラウザ上で簡単にリダイレクトを実装できます。
<script> location.href = "https://example.com/"; </script> |
JavaScriptで「location.href」を使うと、ユーザーの操作や処理結果に応じて動的にURLを切り替えることが可能です。たとえば、フォームのバリデーション後に結果に応じたページへリダイレクトさせることなどが考えられるでしょう。
ただし、ブラウザでJavaScriptが無効になっている場合には動きません。基本的にはリダイレクト制御はサーバーサイドでPHPを使って実装するのがおすすめです。
関連記事
HTMLのhref属性とは?aタグの使い方やhref="#"の意味まで解説
6.PHPでリダイレクト先に値を渡す方法
PHPでリダイレクトさせるとき、入力された情報や処理結果などの値をリダイレクト先に引き継ぎたいときにはどうすればよいでしょうか。たとえば、ユーザー名やエラーコードなどを次のページでも使いたい場合、PHPではいくつかの方法があります。ここでは、GETパラメータ、セッションなどを使った方法について解説します。
GETパラメータをURLに含めて渡す
最もシンプルな方法は、URLの末尾にGETパラメータ(クエリパラメータ)を付けて値を渡す方法です。
$user = "tanaka"; header("Location: welcome.php?user=" . urlencode($user)); exit; |
このコード例のように書くと、welcome.phpにおいて$_GET['user']で値を受け取れます。URLに情報が見えるためデバッグがしやすく、ログイン後のユーザー名表示や処理結果の簡易通知などに適しています。
ただし、値が丸見えなので機密性の高いデータには向いていませんし、長文の情報を渡すのにも向いていません。
セッションを使って値を保持する
ログイン情報やフォーム入力の一時保持など、外部に露出させたくない値を扱う場合は、セッション を使う方法がおすすめです。セッション変数にデータを保存してからリダイレクトすれば、安全に値を引き継ぐことができます。
session_start(); $_SESSION['status'] = 'complete';
exit; |
転送先のcomplete.phpでは、同様にsession_start関数を使えば$_SESSION['status'] の値を参照できます。セッションはサーバー上で管理されるため、URLがシンプルなままという点もメリットです。
POSTデータは渡せない?その理由と代替手段
header関数を使ったリダイレクトでは、POSTデータをそのまま次のページに引き継ぐことはできません。リダイレクトがHTTPステータスコードに基づく新たなリクエストを発生させるため、元のPOSTデータは失われてしまうからです。
どうしてもPOSTデータを使いたい場合には、hiddenフィールドを含んだ中間ページを挟み、再POSTさせてみましょう。ただし、複雑になりやすいためセッションによる保持がおすすめです。
7.PHPでリダイレクトさせるときに時間指定する方法
ページを一定時間表示した後に、別のURLへ転送させたい場面があります。たとえば、「送信が完了しました。5秒後にトップページへ戻ります」のように表示したあとリダイレクトさせるものです。ここでは、header("Refresh:~)や、HTML・JavaScriptを活用することで実現させる方法を紹介します。
header関数のRefreshヘッダーを使った時間指定
PHPの header 関数では、LocationではなくRefreshを使って、設定時間経過後に自動的にリダイレクトする処理を実装できます。
header("Refresh: 5; URL=home.php"); exit; |
このコード例では、5秒後にhome.phpへ遷移させる指示をブラウザに送ります。ただし、Refreshヘッダーはすべてのブラウザで完全にサポートされているわけではなく、公式なHTTP標準にも含まれていないため、確実に実装したい場合にはおすすめできません。
metaタグやsetTimeoutを使った時間指定
HTMLのmetaタグやJavaScriptのsetTimeout関数を使うと時間を指定したリダイレクトが実装可能です。
HTMLのmetaタグで実装する例
<meta http-equiv="refresh" content="5;url=home.php"> |
このコード例ではページ表示後5秒で home.phpへ移動します。ブラウザ依存は多少あるものの、視覚的にカウントダウンを想定した設計に向いています。
JavaScriptで実装する例
<script> setTimeout(function() { window.location.href = "home.php"; }, 5000); </script> |
こちらのコード例はJavaScriptで5秒後にリダイレクトを実行します。
8.PHPでリダイレクト前の元のページへ戻す処理の書き方
ログイン後のリダイレクトやエラー発生時の復帰処理など、リダイレクトさせたものの、1つ前のページに戻したいとか、直前にいた画面にリダイレクトさせたいケースもあるのではないでしょうか。
ここでは、PHPのHTTPリクエストヘッダーに含まれるリファラ情報を使って、直前のページに戻す処理の書き方について解説します。
HTTP_REFERERを使ったリダイレクト
HTTP_REFERERを使うと、直前にアクセスしていたページのURLを取得し、そのURLへリへダイレクトすることが可能です。
if (!empty($_SERVER['HTTP_REFERER'])) { header("Location: " . $_SERVER['HTTP_REFERER']); exit; } else { header("Location: fallback.php"); exit; } |
このコード例では、リファラ情報がある場合にそのURLへ戻り、リファラ情報がない場合には代替のページ(このコード例ではfallback.php)へ遷移させています。
リファラ情報が取得できない場合の対応方法
HTTP_REFERER を使うリダイレクトは便利な一方で、リファラ情報が送信されないケースも存在します。たとえば、次の状況では'HTTP_REFERERが空になることがあります。
ユーザーが直接URLを入力した場合
セキュリティ設定によりRefererが無効化されている場合
HTTPSからHTTPへの遷移時
このような場合に備えて、取得できなかった場合のフォールバック処理を実装しておくことが重要です。また、確実に戻したいページがある場合は、POSTやセッション変数などを使って、URLを明示的に管理しても良いでしょう。
9.PHPにおけるredirect()とフレームワークでの使い方
PHPには redirect() という関数は存在しませんが、LaravelやCakePHPなどのフレームワークでは、リダイレクト処理を簡潔に書ける専用の redirect() 関数やメソッドが用意されています。ここでは、代表的なフレームワークやCMSにおけるリダイレクトの書き方を紹介します。
Laravelのredirect()関数
Laravelでは、redirect() を使って簡単にリダイレクトを記述できます。たとえば、指定したURLへ遷移させるには次のように書きます。
return redirect('/dashboard'); |
ルート名やコントローラーアクションへのリダイレクトも可能です。
return redirect()->route('home'); return redirect()->action([HomeController::class, 'index']); |
また、セッションにフラッシュメッセージを保存して、リダイレクト先で表示させることもできます。
return redirect('/login')->with('error', 'ログインが必要です。'); |
CakePHPのredirect
CakePHPでは、コントローラー内で $this->redirect() メソッドを使ってリダイレクトを行います。
return $this->redirect(['controller' => 'Users', 'action' => 'login']); |
URLを直接指定する場合は、次のコード例のようにも書けます。
return $this->redirect('/dashboard'); |
WordPressのwp_redirect
WordPressでは、wp_redirectを使うことでリダイレクトを実装可能です。プラグイン開発やテーマのfunctions.php内で、次のコード例のように記述しましょう。
wp_redirect(home_url('/thanks')); exit; |
wp_redirectは WordPressが提供するリダイレクト関数で、内部的には header() を使用しています。安全なURLへのリダイレクトを保証するために、WordPressのフィルターやバリデーションが適用される点が特徴です。また、現在の投稿やカスタム投稿のURLに基づいて動的にリダイレクト先を生成するような処理も可能です。
フレームワークやCMSごとにリダイレクトの書き方は異なりますが、各ツールが提供する機能を活かしつつ、安全でわかりやすいリダイレクト処理を実装して下さい。
関連記事
Laravel【PHP】とは?入門のためのインストール方法やコード付きで使い方をわかりやすく解説
10.まとめ
この記事では、PHPによるリダイレクト処理の基本から応用まで解説しました。header関数の使い方、条件分岐によるページ遷移、リダイレクト時のエラー対策やセキュリティ面での活用法など、実践的な知識を具体例とともにご紹介しましたので、初心者の方からPHPを既に使っている方まで役立つはずです。
PHPでWebアプリケーションを構築・運用する場面でリダイレクト処理は重要です。ぜひ本記事を参考に、信頼性の高いリダイレクト実装に取り組んでみてください。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。
自身に最適なフリーランスエージェントを探したい方はこちらよりご確認いただけます。