PHP画面が真っ白 header(“Location: $url”);
2017/03/09
header(“Location: $url”);を使ったら画面が真っ白になった
header(“Location: $url”);を使うときの注意点
PHPでリダイレクト処理をする「header(“Location: $url”);」を使うときに発生した画面が真っ白になる不具合についてです。
業務を行っていて、ディレクタから画面が真っ白になるページがあるので確認をしてほしい、という依頼がありました。
ページの修正を行ったところ、画面が真っ白になるページが出てきた、というのです。
そこで調べた結果、2つの不具合があることが分かりました。
直接的な原因は、プログラムファイルへのリンクの記述が間違っていたことでした。
ですが、プログラム上にはリンクの記述などが間違っている場合に処理されるエラー処理があったのですが、そちらも不具合があったことで正常なエラー処理が行われず画面が真っ白になっていた、というものでした。
具体的には、エラーの場合はトップページにロケーションする「header(“Location: $url”);」の処理が記述されていましたが、この記述が間違っていたことが原因で、ロケーション処理が実行されずに画面が真っ白になってしまっていました。
具体的な間違いは以下の通り。
|
1 2 3 |
誤り header("Location : $url"); ↓ 正解 header("Location: $url"); |
画面上では若干見にくいのですが、誤りの方は「Location」「:」との間に半角スペースが入っていますが、これがエラーの原因でした。
「Location:」はこの塊で一つの単語として認識されており、これをこのまま記述しないとエラーとなるようです。
そして、この問題の一つの重大なポイントは、エラーが発生してもエラーメッセージが表示されないことです。(エラーログも出力されません。)
そのため、このエラーが発生しても何がエラーなのかが判別するまでに時間がかかる可能性があるということです。
自分でプログラムを作っていて、ちょうどその部分のデバッグをしてしているような場合には分かるかもしれませんが、今回の私の様にほかの方が作ったプログラムをチェックする場合、最初からエラーチェックの処理を細かくチェックしませんので、発見までに時間がかかることがあるかもしれませんね。
ちなみに、「Location」の「L」は大文字でも小文字でも問題ありません。「:」の後ろにはスペースが入っても入っていなくても問題ありません。
今回のプログラムは自分で作ったものではありませんでしたが、プログラムを見やすくするためにスペースを入れることを多用する方なので、今後同じようなことを起こさないように気を付けたいと思いますね。
Smartyもスペースの取り扱いに注意が必要
ちなみに、PHPのテンプレートエンジン、Smartyを使う場合も同じようにスペースは不具合の原因になりますので気をつけたいところですね。
Smartyの Syntax Errorの原因はスペースかも
サーバを移転したりPHPのバージョンを変えたりしたときに画面が真っ白に
- PHPのバージョンアップをした。
- サーバを移転した。
- ローカル環境から本番環境に移した。
といった感じで、PHPの設定そのものが変った可能性がある場合に画面が真っ白になるという不具合の場合は、PHPのショートタグの設定が原因の場合もあります。
ショートタグとは、PHPの宣言を「<? …… ?>」という省略形式で記述する方式のことですが、この設定を有効にするか否かのデフォルト設定が、PHPのバージョンによって違うため、動かなくなる可能性があります。
それについて「サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない」に記事を書いていますので、詳細はこちらを参照してみてください。
気づかないうちにテキストを出力している場合も
そもそも「header(“Location: $url”);」の処理で、画面が真っ白になるエラーの原因として多いのは、すでに header情報を出力してしまっているという場合があります。
「<head>...</head>」として header情報を出力していなくても、何かしらのテキストがすでに編集されている場合は、それはすでに header情報が出力されているものとして処理され、「header(“Location: $url”);」はエラーとして処理されません。
リダイレクト処理が行われないときに HTMLのソースを見て、何かしらテキストが出力されていればエラーの原因は分かりやすいのですが、改行だけが出力されている場合もテキストが編集されているとして扱われ、エラーとなります。
そんなことが原因で発生したエラーがありましたのでご紹介します。
|
1 2 3 4 5 6 7 8 |
<?php (しょり) ?> <?php header(location: ../); ?> |
もともと「header(“Location: $url”);」が記述してあったプログラムの上部に、他のプログラムの処理をコピペで追加する作業を行ったことがありました。
追加した上部の処理は正常に動いていたのですが、いざ「header(“Location: $url”);」の処理をしようとすると画面が真っ白のエラーになるのです...
処理を追加するまでは正常に動いていたのに、です。
さんざん悩まされて、かなりの時間を浪費したエラーの原因は、処理をつなげたことによって発生した 4、5行目の改行でした...
この空行が原因で「header(“Location: $url”);」が正しく動作しないという不具合につながってしまっていました。
今回は処理をつなげたことでこの空行が発生しましたが、1行目の「<?php」の前に空行が入っている場合は潜在的に不具合の原因を作っているということになるのかもしれませんね。
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。
-
-
ob_start、ob_get_contents関数でPHPの標準出力をバッファリング・変数に代入
標準出力をバッファリングし変数に代入することができるob_start()関数の解説。include()の処理をバッファリングすることで自由な場所に処理を記述することが可能。
-
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
-
-
ファイル変更だけ!ECCUBEの本番から開発環境をコピーする手順を解説
ECCUBEを本番から開発環境をコピーする際の手順を解説。PGMメンテに必要な開発環境を構築する手順を解説。ECCUBEの仕組みは簡単なので作業は5分ほど。
-
-
Basic認証の.htaccess、.htpasswd生成ツールと解説
Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。
-
-
JSON形式の値を配列形式に変換・PHPでは json_decode()、json_encode()
JSONとは「JavaScript Object Notation」の略でテキストベースのデータフォーマット。JSONの値をPHPで配列に変換するWebツールの紹介とその処理「json_encode()」「json_decode()」関数の解説。
-
-
CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
CentOS6系、7系のPHPバージョンを5.3から5.6、7.0、7.1にアップする作業手順と解説。yum updateコマンドを使い作業時間は約10分。コマンドの解説や引数の意味なども解説しているので役に立つはず。
-
-
カオナビAPI Ver.2.0のtokenを取得する PHP+cURLのサンプルプログラム
PHPのcURLを使用してカオナビAPIのアクセスに必要なtoken、シートの情報を取得するサンプルプログラムを作成。cURLの処理は関数化しているため他のAPIでも流用できる。
-
-
PHPで1ヵ月前、先月、今月1日、来月末の日付などの算出はDateTimeImmutableを使う
PHPには日時をオブジェクトとして生成する関数「DateTimeImmutable」「DateTime」が用意されている。これを利用して1ヶ月後、月初日、月末日、5日後などを指定して日付を取得できる。
-
-
ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説
ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!