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
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
ECCUBEでアップロードできない。upload_max_filesizeを設定する場所
テンプレートをアップロードする際に発生するエラー「テンプレートファイルがアップロードされていません」の対処方法。これはファイル容量の制限に引っかかっています。
-
-
cURLを利用する際の注意点「
&
」があるURLは「”
」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。
-
-
ECCUBEを開発環境から本番ドメインに変更でエラーが・パス変更について
レンタルサーバでサーバ会社から割り当てられたURLで開発し、本番公開時にドメインを当てたらエラーが!そんな場合の対処方法の解説。対処方法は簡単ですが管理画面からは対応不可。
-
-
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。
-
-
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分。コマンドの解説や引数の意味なども解説しているので役に立つはず。
-
-
ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説
ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。
-
-
Smartyのテンプレート内の処理で計算、加工をする方法
Smartyのテンプレート上で変数を計算する、加工する方法を解説します。
-
-
路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索
路線・駅検索の仕組みの構築は大変。登録する側も最寄り駅が多い場合は大変。なので簡易に実装するため緯度経度に基づき直線距離を計算する処理を考案して実装して、その処理を解説。
-
-
WindowsのXAMPPのPHPではstrptimeは使用不可。代替はdate_parse_from_formatを使う
strptimeはWindowsのPHPには未実装。LinuxとMacで挙動が異なる。PHP8.1で非推奨になる。なので日付のチェックはdate_parse_from_formatを使おう。使い方を詳細解説。
-
-
ECCUBEの管理画面のSSL設定をインストール後に変更する方法
ECCUBEをインストールした後から管理画面のSSL設定を変更する方法を解説します。config.phpファイルのHTTPS_URLとADMIN_FORCE_SSLの値を変更すればOK。