エス技研

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.

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

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

  関連記事

CentOS6、7のPHPを5.3から5.6、7.0、7.1にバージョンアップする手順の解説
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分。コマンドの解説や引数の意味なども解説しているので役に立つはず。

路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索
路線・駅検索をPHPで実装する方法解説。GoogleMapsの緯度経度から計算し検索

路線・駅検索の仕組みの構築は大変。登録する側も最寄り駅が多い場合は大変。なので簡易に実装するため緯度経度に基づき直線距離を計算する処理を考案して実装して、その処理を解説。

ECCUBEでテンプレートファイルのファイルサイズは10MB以下のものを使用してくださいのエラーが出た場合

テンプレートをアップロードする際にファイルサイズが大きすぎてエラーが表示される際の対処方法解説。パラメータ設定で設定する制限について解説を行っています。

include、requireのパス指定をdirname(__FILE__)、__DIR__と書く理由

include、requireのパスの指定を dirname(__FILE__)、__DIR__で記述する理由に付いて解説。相対パス、絶対パスを直書き、パスを書かない場合は何が問題かを説明。

ECCUBEの問い合わせフォームに任意の値を引数として渡す方法

ECCUBEのお問い合わせフォームに値を固有の情報を送りそれに基づいて処理をする方法を解説。ボタンの設置、受け取り側のテンプレート、プログラムのサンプルソースを提供。

路線・駅検索のために緯度経度からPHPで簡易的に距離を計算する処理解説
路線・駅検索のために緯度経度からPHPで2点間の距離を計算する処理解説

路線・駅検索の仕組みの構築は大変。それを簡易に実装するために緯度経度を元に距離計算をする仕組みを考案。まずは2点間の距離を計算する仕組みを解説し、距離計算にまつわる関連技術も紹介。

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

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

ECCUBEの管理画面のSSL設定をインストール後に変更する方法

ECCUBEをインストールした後から管理画面のSSL設定を変更する方法を解説します。config.phpファイルのHTTPS_URLとADMIN_FORCE_SSLの値を変更すればOK。

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

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

PHPのソースで見慣れない記号が出てきた・アロー演算子(->)、ダブルアロー演算子(=>)

PHPのプログラムソースには見慣れない記号が出てきます。その意味や調べ方です。