エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


PHP画面が真っ白 header(“Location: $url”);

      2017/03/09

header(“Location: $url”);を使ったら画面が真っ白になった

 

header(“Location: $url”);を使うときの注意点

 
PHPでリダイレクト処理をする「header(“Location: $url”);」を使うときに発生した画面が真っ白になる不具合についてです。
 
 
業務を行っていて、ディレクタから画面が真っ白になるページがあるので確認をしてほしい、という依頼がありました。
ページの修正を行ったところ、画面が真っ白になるページが出てきた、というのです。
 
 
そこで調べた結果、2つの不具合があることが分かりました。
直接的な原因は、プログラムファイルへのリンクの記述が間違っていたことでした。
ですが、プログラム上にはリンクの記述などが間違っている場合に処理されるエラー処理があったのですが、そちらも不具合があったことで正常なエラー処理が行われず画面が真っ白になっていた、というものでした。
 
具体的には、エラーの場合はトップページにロケーションする「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のソースを見て、何かしらテキストが出力されていればエラーの原因は分かりやすいのですが、改行だけが出力されている場合もテキストが編集されているとして扱われ、エラーとなります。
 
 
そんなことが原因で発生したエラーがありましたのでご紹介します。
 

 
もともと「header(“Location: $url”);」が記述してあったプログラムの上部に、他のプログラムの処理をコピペで追加する作業を行ったことがありました。
追加した上部の処理は正常に動いていたのですが、いざ「header(“Location: $url”);」の処理をしようとすると画面が真っ白のエラーになるのです...
処理を追加するまでは正常に動いていたのに、です。
 
さんざん悩まされて、かなりの時間を浪費したエラーの原因は、処理をつなげたことによって発生した 4、5行目の改行でした...
 
この空行が原因で「header(“Location: $url”);」が正しく動作しないという不具合につながってしまっていました。
今回は処理をつなげたことでこの空行が発生しましたが、1行目の「<?php」の前に空行が入っている場合は潜在的に不具合の原因を作っているということになるのかもしれませんね。

 - PHP・Smarty・ECCUBE

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い

PHPのデバッグ等で変数や配列の中身を確認するために使用する関数print_r、var_dump、var_exportの動作の違い、仕様の違いについて確認した。var_exportがオススメ。

Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説

お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。

乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!

乱数やパスワードを生成する乱数発生器を高速化!重複しない10桁、20桁の文字列を10万件、20万件と生成することも可能!イベントのキャンペーンのシリアルコードなどにも利用可能!

PHPで正規表現の検証には preg_match_allが便利

PHPで正規表現の検証には preg_match_allが便利です。その便利さの使い方の解説です。

PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較
PHPのcURLでAPIやWebサイトへのアクセス方法。file_get_contentsとの比較

PHPからWebサイトにアクセスしてHTMLを取得、APIにアクセスして情報を取得する場合は、cURLがオススメ。file_get_contentsでも可能だがエラー制御に難がありトラブルのもとになる。

AdminerはphpMyAdmin代替のデータベース管理ツール

AdminerはphpMyAdminとほぼ同機能のデータベース管理ツール。PHP 1ファイルのため設置が非常に簡単で軽快に動作し、phpMyAdminの置き換えで使うのも問題なし。

sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる
sleepの秒指定は整数のみなので1.5秒はsleep、usleepを組み合わせる

PHPのプログラム処理を遅延させる「sleep()」は整数秒単位。「usleep()」は1秒未満のマイクロ秒単位。では「1.5」秒はどう表現するのか。「sleep()」「usleep()」を組み合わせる。その解説。

ECCUBEでカード決済NGの受注情報をマイページ購入履歴に表示しない方法解説

ECCUBEでカード決済に失敗しても購入履歴一覧に注文情報(受注情報)が表示される問題への対処方法を解説。受注情報レコードの作成の流れとステイタスについても解説。

ob_start、ob_get_contents関数でPHPの標準出力をバッファリング・変数に代入

標準出力をバッファリングし変数に代入することができるob_start()関数の解説。include()の処理をバッファリングすることで自由な場所に処理を記述することが可能。

ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説

ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!