プログラミング雑記

【PHP】header('Location: ... でリダイレクトされない時の意外な原因

goke

個人開発から世界を変えるようなプロダクトづくりを目指しています

はじめに

あんなに悩んでいた問題がいつの間にか解決されている、という瞬間に出会うたびにプログラミングって面白いなと思います。この記事もそんな話です。
普段使っている関数に実はこんなルールがあった(そしてこれまではそのルールに偶然引っかかってなかっただけ)、と知り驚くことがたまにありますが、PHPでheader locationとするときのルールはご存知でしょうか?

headerでリダイレクトするときのルール

PHPでリダイレクトを行いたいとき、

header('Location: https://ashitakubi.com/');

とすれば簡単にリダイレクトできます。
この方法を使うときに気をつけなければならないことは、これよりも前に何1つ出力をしてはいけないということです。

PHPのマニュアルにはこうあります。

覚えておいて頂きたいのは、header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の 出力の前にコールする必要があることです。 頻出するエラーとして、include または require 関数、他のファイルをアクセスする関数に 空白または空行があり、header() の前に出力が 行われてしまうというものがあります。

PHP マニュアル

例えば下記の場合はリダイレクトされません。

echo "hello";
header('Location: https://ashitakubi.com/');

いうまでもなく、echo "hello"; として文字列を出力してしまっているからです。

headerでリダイレクトするときはrequireにも注意

上記のルールを守っているにも関わらずなぜかリダイレクトがうまくいかないことがありました。
header(' ...の位置をあれこれ変えてみてデバッグしたところ、

<?php
header('Location: https://ashitakubi.com/'); //うまくいく
require_once '_function.php';
header('Location: https://ashitakubi.com/'); //うまくいかない

require_onceの前後に問題があることが判明。
しかし、ここでrequire_onceしている_function.phpというファイルの中身はというと次のようななんでもないファイルで、出力の類は一切行っていませんでした。

<?php
function calc(){
  return xxx;
}
?>

が、しかし、よく見ると、

?>の後に改行が入っていることに気がつきました!

なるほど、このファイルを読み込むと改行が出力されてしまうということか。
改行を消したらうまくリダイレクトされました。

最後に

PHPを含めたプログラミング言語の年収と習得の難しさをランキングにしてみました。
合わせてご確認ください。

あわせて読みたい
  • この記事を書いた人

goke

個人開発から世界を変えるようなプロダクトづくりを目指しています

-プログラミング雑記