「エラー: 予期しない出力により Cookies がブロックされました」は、よくあるログイントラブルとは違います。
WordPressサイトの管理画面にログインしようとして、出来ない事が有ります。
ほとんどの場合は、
- 使っているブラウザから、該当Cookie(そのWordPressサイトのドメイン名)を削除する
- ‘wp-admin’ の代わりに ‘wp-login.php’ を使う
- wp-config.phpwp-config.phpにdefine( ‘RELOCATE’, true ); か
define(‘WP_HOME’,’変更前アドレス’); と
define(‘WP_SITEURL’,’変更前アドレス’); を追記 - プラグイン名を一時的に変えて、1つずつ元の名前に戻していきながら原因探し
(バズ部 – WordPressのログイン方法とログインできない場合の解決法 で詳しく説明されています。)
で解決するわけですが、こんなログイン画面が表示されたら
上記の方法では解決出来ません。
これが表示された時は、ほとんどの場合、サーバが ‘HTTPレスポンスヘッダー‘ 情報を送り出す前にhtmlが出力されるエラーが発生しています。
症状の確認 – debug.logを出力し、チェックします。
それを確認する為にftpクライアントでWordPressディレクトリに入り、WordPressディレクトリ直下の ‘wp-config.php‘ をeditorで開いてやります。
そして80〜90行あたりにある
1 |
define('WP_DEBUG', false); |
を
1 2 3 4 5 6 |
define('WP_DEBUG', true); if (WP_DEBUG) { define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false); @ini_set('display_errors',0); } |
と書き換えてやります。
これはブラウザにエラーメッセージを表示させずに、’debug.log’ に書き出し、’/wp-content/’ に保存させるコードです。
(詳しくは、wp-login.phpのデバッグ忘れ(WordPressのデバッグ方法)をご覧下さい。)
その後、問題のログインページを再呼込みします。
ftpクライアントでWordPressサイトの ‘/wp-content/’ に ‘debug.log’ が生成されている筈ですので、Macなら ‘コンソール’ (Windowsなら ‘イベントビューア’ でいいのかな?)で開いてみます。
すると
1 2 3 |
PHP Warning: Cannot modify header information - headers already sent by (output started at /path/hogehoge/wp-config.php:1) in /path/hogehoge/wp-login.php on line 403 |
とか
1 2 3 |
PHP Warning: Cannot modify header information - headers already sent by (output started at /path/hogehoge/wp-content/themes/hogehoge/functions.php:1) in /path/hogehoge/wp-login.php on line 403 |
のログが書き込まれていると思います。
「ヘッダー情報を変更する事は出来ません – /path/hogehoge/wp-login.phpの403行で、(最初の例では)/path/hogehoge/wp-config.phpの1行目 (2番目の例では)/path/hogehoge/wp-content/themes/hogehoge/functions.phpの1行目によってヘッダーは既に送信されています。」
と言ってきてるんですね。
‘HTTPレスポンスヘッダー’ 情報は何よりも先に送り出す事になっているので、html(’HTTPレスポンスボディー’)が送り出された時点でヘッダーとは見なされなくなります。
config.phpやfunctions.phpの1行目で何か(文字・半角全角スペース・改行等制御文字など)が送信され、それがhtmlだと見なされて、実際のヘッダー情報は不正な変更と判断され、エラーとなるんですね。
PHPのError messageやdebug.logは、割と原因が判り易いので助かります。
config.phpやfunctions.phpの1行目は
1 |
<?php |
とならないといけないのですが、
冒頭に半角スペースが入って気がつかず
1 |
<?php // 冒頭に半角スペースが有る |
としたり、1行目を改行して
1 2 |
// ここに改行コードが入る <?php |
となっている事があります。
これは ‘<?php‘より前の部分だけでなく、 最後の ‘?>‘ より後に文字(空白や制御文字も含む)が入っていても、’Cannot modify header information’ のエラーとなりますし、場合によっては ‘<?php‘ と ‘?>‘ の間に不必要な改行とスペースなどが入っていても起きます。
これはwp-config.phpやfunctions.phpだけでなく、wp-login.phpやプラグインのphpファイルで起きる事も有ります。
さらにややこしい事に、ファイル保存時のエンコードのタイプによって、起きる事も有ります。
WordPressのphpファイルの場合、エンコードは ‘UTF-8’ にするんですが、この ‘UTF-8’ には ‘BOM付き’ があり、これでエンコードをすると、ファイルのテキストの前に符号化の種類の判別コードが付き、 それが文字と誤認されるので、’<?php‘ の前に文字が有るということで、’Cannot modify header information’ のエラーとなります。
BOM(byte order mark)とはなにか?
ボムと呼び、データに使われている文字コードがUnicodeである事や、1と0で表されている文字データを、どのような規則で1文字ずつに分割するか( ‘endianness’ とか ‘byte order’ というやつ)を、テキストデータ部の前に付ける数バイトのデータの事です。
Unicodeは世界中の文字を扱える事を前提に考案されていますが、それ迄にASCIIやShift-JISやJIS、EUC-JPなど数々の文字コードが入り交じって使われたいたので、「文字はUnicodeである」と言う事と、多くの種類に分かれている1文字を決める為のバイトの分割方法を明示しなければいけなかった為、付けられる様になったものです。
UnicodeはUTF-8以外にUTF-7、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-LEなど何種類も有りますが、UTF-8ではBOMが付くとプログラムが正常に処理出来なくなる事が有り、データベースやメモリにロードするデータ等は、普通BOMでエンコードしません。
WordPressや他のPHPのWebプログラムでも、‘UTF-8 BOM無し‘(単に ‘UTF-8‘ 又は ‘UTF-8N‘ と表示)を使います。
「エラー: 予期しない出力により Cookies がブロックされました」の解決方法
解決方法は、
- まずwp-config.phpの
1define('WP_DEBUG', false);123456define('WP_DEBUG', true);if (WP_DEBUG) {define('WP_DEBUG_LOG', true);define('WP_DEBUG_DISPLAY', false);@ini_set('display_errors',0);} - ‘PHP Warning: Cannot modify header information’ の記述が有れば、その後の
‘headers already sent by (output started at’ 以降にかかれているのファイルの行と前後に不正な文字・スペース・改行などが無いか調べる。 - 問題が無ければ、wp-config.phpと、使っているテーマのfunctions.phpで ‘<?php’ が1行目の冒頭に有る事を確認。
- 問題が無ければ、wp-config.phpとfunctions.phpに ‘?>’ が有れば、その後に文字・スペース・改行などが無い事を確認。
- 問題が無ければ、wp-config.phpとfunctions.phpを ‘UTF-8 BOM無し’ で保存しなおす。
- まだログイン画面のエラーメッセージが消えない場合、WordPressディレクトリ直下のwp-login.phpとindex.phpで ‘<?php’ 以前と ‘?>’ 以後を確認。
- 問題が無ければ、wp-login.phpとindex.phpを ‘UTF-8 BOM無し’ で保存しなおす。
- まだログイン画面のエラーメッセージが消えない場合、プラグインのphpファイルで ‘‘ 以後を確認。
- 問題が無ければ、プラグインのphpファイルを ‘UTF-8 BOM無し’ で保存しなおす。
となります。
しかしこれでも解決出来ない場合は、最終手段となります。
‘php.ini’ の ‘output_buffering’ の設定を ‘on’ にする
‘php.ini’ の ‘output_buffering‘ は、ディフォルトでは ‘off’ ですが、それを ‘on‘ にします。
するとWordPressのログイン画面に「エラー: 予期しない出力により Cookies がブロックされした」のエラーメッセージは出なくなり、ログイン出来る様になります。
‘output_buffering‘ を ‘on‘ にすると、’HTTPレスポンスボディー(つまりhtml部分)’ がバッファーリングされ、先に ‘HTTPレスポンスヘッダー(つまりヘッダー部分)’ が送り出されるので、エラーが起きなくなるのです。
‘<?php‘ の前に半角スペースを入れていたり、’?>‘ の後に改行を入れていたり、保存時のエンコードをBOM付きでしていたり、以外と気が付かないものです。
気が付き難いだけに、原因究明にも手こずったりします。
ご注意下さい。