こんにちは、最近やっと購入したノートパソコンのキーボードに慣れてきたひろです。
PHPでウェブ開発をしている際に、
ログインしていない人をトップページにアクセスさせる方法はないのかなぁ……。
など、ユーザーを別のページに転送したい!と思ったことはありませんか?
今回は、そんなときに使えるheader関数を紹介します!このheader関数を使うことによって、別のページにアクセスさせることができます。是非参考にしてみてください。
phpのheader関数を使うことで別のページにリダイレクトできる
ここでのリダイレクトというのは、「あるページから別のページに転送すること」です。エンジニアでの会話でよく使う言葉ですので、ここで覚えてしまうことをおすすめします。
header(‘Location:URL’)で指定したページにリダイレクトできる
このheader関数の使い方ですが、引数(括弧の中)に
1 2 |
header('Location:URL'); exit; |
とすることで指定したURLにリダイレクトすることができます。例えば、
1 2 |
header('Location:https://webukatu.com'); exit; |
とするとウェブカツのトップページにリダイレクトさせられます。ここのURLは相対パスでも問題ありません。
最初の例でいうと、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php //いろいろな処理 //isLoginはログインしているかどうか判定する関数 //ログイン状態ではないユーザーの場合falseを返してくれる if(!isLogin($user)){ //ログイン状態ではない場合、トップページにリダイレクトさせる header('Location:~~~.com'); exit; } //処理の続き |
このような処理を導入することにより、このページにはログインしていないユーザーはトップページにリダイレクトさせられるようにできました。
header関数の直下にexit;をつけると思わぬエラーを防ぐことができる
このheader関数のリダイレクトはすぐには実行されず、その下のページの読み込みを終えてから行われます。リダイレクトする場合、今いるページの処理は必要ないことが大半のため、exit;をつけることで処理をその時点で終了させます。
先程の例の場合、exit;をつけないことで、処理の続きが実行されてしまうことになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php //いろいろな処理 //isLoginはログインしているかどうか判定する関数 //ログイン状態ではないユーザーの場合falseを返してくれる if(!islogin($user)){ //ログイン状態ではない場合、トップページにリダイレクトさせる header('Location:~~~.com'); } //データを消す処理 deleteUserData($user); |
もしもこのような処理を行うページでexit;をつけ忘れてしまった場合、ユーザーのデータを消してしまうことになります。
処理をその時点で終了させることで、ウェブページの高速化につながり、不必要な処理をさせないことでバグを発生させにくくさせる効果もあるため、基本的にはつけておくほうが良いでしょう。
phpのheader関数のよくあるエラー
header関数を使用することで非常にかんたんにリダイレクトを実装することができますが、header関数は気をつけなければならないことがいくつかあります。間違えて使用するとエラーとなってしまい、リダイレクトできなくなるので注意が必要です。
<html>の中に書いている
1 2 3 4 5 6 7 8 9 10 11 |
<html> <head> </head> <body> <?php //htmlが先に出力されているため、エラーとなってしまいリダイレクトできない header('Location:https://webukatu.com'); exit; ?> </body> </html> |
このheader関数は、実行される前に出力があるとエラーとなり動いてくれません。今回の場合、すでに<html>や<head>などが出力されてしまっているため、エラーが発生してしまいリダイレクトできません。
リダイレクトさせるときには必ず実行の前にhtmlの中で処理を実行していないかチェックしましょう。
header関数の前にechoやprintなどの出力を行っている
1 2 3 4 5 6 |
<?php echo 'Hello World!'; //header関数のリダイレクトの前に出力を行っているとエラーになり、リダイレクトできない header('Location: https://webukatu.com'); exit; ?> |
こちらはechoやprintなどで出力が行われています。実行の前に出力があるとリダイレクトできなくなってしまいますので、エラーが起きてしまった際には、header関数の前にechoやprintでの出力がないか確認してみましょう。
「<?php」の前に改行がある
1 2 3 4 5 |
//ここに余分な改行があると、エラーとなってしまいリダイレクトできない <?php header('Location: https://webukatu.com'); exit; ?> |
この余分な改行も出力となり、エラーの原因となります。header関数でエラーが発生したときには、1行目に改行が入っていないか確認してみましょう。
Locationとコロン(:)の間にスペースを入れている
1 2 3 4 5 |
<?php //Locationと:の間にスペースが入っているとエラーとなりリダイレクトできない header('Location :https://webukatu.com'); exit; ?> |
これもよくあるエラーの原因ですが、Locationとコロンの間に半角スペースが入っているとエラーとなり、動いてくれません。
1 |
header('Location:https://webukatu.com'); |
確認するときは少し見づらいですが、必ずLocationとコロンはくっつけるようにましょう。
「<?php 」のように不要な半角スペースが入っている
1 2 3 4 5 6 |
<?php //非常に確認しづらいが、「?php 」となっており、半角スペースが入っている //これによりheader関数がエラーを起こしリダイレクトできない header('Location:https://webukatu.com'); exit; ?> |
半角スペースが入ってしまうとエラーとなりリダイレクトできなくなります。とても確認しづらいですが、header関数を使う際には余分なスペースがないか必ず確認するようにしましょう。
BOM付きで保存されている
一部のテキストエディタでは、utf8で保存する際にBOM付で保存されている場合があります。
BOMというのはUnicodeの符号化形式で符号化したテキストの先頭につけるデータのことですが、たまにこのデータが付いている場合があります。上記のエラーの原因以外だった場合、このBOM付きで保存されてしまっているためにエラーが発生してしまう場合があります。
まとめ
いかがでしたか?今回は、
を紹介しました。このリダイレクトというのは、Web開発を行う際に欠かせません。ぜひこの記事でマスターしていってくださいね。
参考:https://www.php.net/manual/ja/function.header.php