エス技研

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.

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

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

  関連記事

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

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

指定した数で文字列を丸める関数substr、mb_substr、mb_strimwidthの違い
指定した数で文字列を丸める関数substr、mb_substr、mb_strimwidthの違い

文字列を指定された数で抜き出すPHPの関数、substr、mb_substr、mb_strimwidthについての解説。似た関数だが引数の指定方法が違ったり、文字数がバイト数か文字数かも違ったり、注意が必要だ。

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

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

パーミッション(属性)一括変更ツール・WordPress最適化済

WordPressのパーミッション(属性)を一括変更するツールを作成!ファイル、フォルダのパーミッションが一覧表示でき、ファイルを選んでパーミッションの変更が行えます。

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

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

Basic認証の.htaccess、.htpasswd生成ツールと解説

Basic認証を設定する際に必要となる.htaccess、.htpasswdファイルを生成するツール。ID、PASS、.htpasswdへのパスを入力することで編集する情報を生成します。

PHPパーミッション変更のchmod関数・モードを変数で指定する方法

パーミッション変更関数であるchmod関数の第二引数、ファイルモードの指定に変数を使う場合は8進数に変換するoctdec関数を使って変換します。

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

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

GMOペイメントゲートウェイのjava.io.IOExceptionのエラー

ECCUBEの決済でGMOペイメントゲートウェイのモジュールを使ってテスト決済を行った場合の不具合、java.io.IOExceptionと言うエラーの原因と対策方法の解説です。

ECCUBEの注文完了画面注文番号と商品情報を編集するCRITEO(クリテオ)タグを編集

ECCUBEの注文完了画面にクリテオのタグを編集する方法を紹介。標準機能では完了画面に注文IDや購入商品の情報を渡さないため改修が必要です。