WordPressで「エラー: 予期しない出力により Cookies がブロックされました」が出た時の対処法

「エラー: 予期しない出力により Cookies がブロックされました」は、よくあるログイントラブルとは違います。

WordPressサイトの管理画面にログインしようとして、出来ない事が有ります。

ほとんどの場合は、

  1. 使っているブラウザから、該当Cookie(そのWordPressサイトのドメイン名)を削除する
  2. ‘wp-admin’ の代わりに ‘wp-login.php’ を使う
  3. wp-config.phpwp-config.phpにdefine( ‘RELOCATE’, true ); か
    define(‘WP_HOME’,’変更前アドレス’); と
    define(‘WP_SITEURL’,’変更前アドレス’); を追記
  4. プラグイン名を一時的に変えて、1つずつ元の名前に戻していきながら原因探し

バズ部 – WordPressのログイン方法とログインできない場合の解決法 で詳しく説明されています。)

で解決するわけですが、こんなログイン画面が表示されたら
管理画面にログイン出来ない上記の方法では解決出来ません。
これが表示された時は、ほとんどの場合、サーバが ‘HTTPレスポンスヘッダー‘ 情報を送り出す前にhtmlが出力されるエラーが発生しています。

症状の確認 – debug.logを出力し、チェックします。

それを確認する為にftpクライアントでWordPressディレクトリに入り、WordPressディレクトリ直下の ‘wp-config.php‘ をeditorで開いてやります。
そして80〜90行あたりにある

と書き換えてやります。
これはブラウザにエラーメッセージを表示させずに、’debug.log’ に書き出し、’/wp-content/’ に保存させるコードです。
(詳しくは、wp-login.phpのデバッグ忘れ(WordPressのデバッグ方法)をご覧下さい。)

その後、問題のログインページを再呼込みします。
ftpクライアントでWordPressサイトの ‘/wp-content/’ に ‘debug.log’ が生成されている筈ですので、Macなら ‘コンソール’ (Windowsなら ‘イベントビューア’ でいいのかな?)で開いてみます。

すると

とか

のログが書き込まれていると思います。

「ヘッダー情報を変更する事は出来ません – /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‘より前の部分だけでなく、 最後の ‘?>‘ より後に文字(空白や制御文字も含む)が入っていても、’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 がブロックされました」の解決方法

解決方法は、

  1. まずwp-config.phpの
     

    と書き換えて、保存。その後、問題のログインページを再呼込みし、’/wp-content/debug.log’ を確認。
  2. ‘PHP Warning: Cannot modify header information’ の記述が有れば、その後の
    ‘headers already sent by (output started at’ 以降にかかれているのファイルの行と前後に不正な文字・スペース・改行などが無いか調べる。
  3. 問題が無ければ、wp-config.phpと、使っているテーマのfunctions.phpで ‘<?php’ が1行目の冒頭に有る事を確認。
  4. 問題が無ければ、wp-config.phpとfunctions.phpに ‘?>’ が有れば、その後に文字・スペース・改行などが無い事を確認。
  5. 問題が無ければ、wp-config.phpとfunctions.phpを ‘UTF-8 BOM無し’ で保存しなおす。
  6. まだログイン画面のエラーメッセージが消えない場合、WordPressディレクトリ直下のwp-login.phpとindex.phpで ‘<?php’ 以前と ‘?>’ 以後を確認。
  7. 問題が無ければ、wp-login.phpとindex.phpを ‘UTF-8 BOM無し’ で保存しなおす。
  8. まだログイン画面のエラーメッセージが消えない場合、プラグインのphpファイルで ‘‘ 以後を確認。
  9. 問題が無ければ、プラグインの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付きでしていたり、以外と気が付かないものです。
気が付き難いだけに、原因究明にも手こずったりします。
ご注意下さい。

WordPressで「エラー: 予期しない出力により Cookies がブロックされました」が出た時の対処法」への3件のフィードバック

  1. 小山たけし

    詳しいご説明有難うございます。
    同じように私もエラーが表示されています。いきさつを記入すると長くなるので簡潔にお伝えします。もし必要な情報があれば揃えます、どうぞよろしくお願いします。
    目的は、WordPressをhttpからhttpsにSSL化でした。様々なエラーに見舞われ対処したの地、バックアップデータを復元しましたが改善されません。「http://ドメイン」ではログインページも開くことができません。「https://ドメイン」でようやくログインページが表示されますが、「予期しない出力により Cookies がブロックされました」と表示されます。その前は「Warningエラー」も出ていました。こちらのサイトに載っている順序で症状の確認をしたところ(debug.logを出力し、チェック)下記のような表示が出ましたが、まったくわかりません。初心者の為どうぞ、ご教授頂けると幸いです。宜しくお願いします
    ここから
    [15-Apr-2017 04:48:27 UTC] PHP Strict Standards: Non-static method Press_This_Reloaded::init() should not be called statically in /home/ドメイン/www/rakutinfile/wp-content/plugins/press-this-reloaded/press-this-reloaded.php on line 391
    ここまで

    返信
    1. ロコモコ堂 フルタロコモコ堂 フルタ 投稿作成者

      コメント、ありがとうございます。
      新システム導入路時間がかかり、コメントチェックが遅くなってしまいました。
      申し訳ありません。
      問題は解決されたでしょうか?

      debug.logの内容は、WordPressのダッシュボード > ツール > Press This のPHPファイル上の記述間違いを指摘しています。
      Press This はプラグインとしてインストールされますが、プラグインを呼び出す時の初期化の記述が静的メソッドとして呼び出すべきではないとの警告です。
      サーバで使われているPHPのバージョンが新しくなり、古いバージョンの Press This に将来使えなくなるコードが書かれている場合に表示されます。
      サイトのSSL化にともない、サーバのPHPのバージョンが新しくなり、Press This のコードが合わなくなっているのかもしれません。
      もしサーバのPHPバージョンの変更ができる様でしたら、バージョンを5.4か5.5に戻すとこの警告は出なくなる様に思います。
      警告は PHP Strict Standards ですので致命的なものではありません。
      ちょっと荒技になりますが、サーバの php.ini かWordPressの wp-config.php で error_reportingを修正する記述を入れるか、.htaccessを書き換えて PHP Strict Standards を表示させなくすることもできます。

      また、SSL化すると送受信の方法が変わってきますからプロトコルもhttpは使えなくなり、httpsを使う事になります。

      「予期しない出力により Cookies がブロックされました」は、WordPressのPHPファイル(特にwp-config.phpとfunctions.phpの冒頭の< ?phpや最後に?>がある場合はそれ以降)にスペースや文字・改行が入っている場合や、ファイルをBOMで保存している場合に起きやすいです。
      http://www.locomoco-dou.jp/archives/1820
      でも説明しています。WordPressのバージョンアップで表示されなくなった箇所も表示する様に修正しましたので、ご覧ください。

      まだ問題が続いている様でしたら、詳しく調べる事も出来ますので、ご連絡ください。

      ロコモコ堂 フルタ

      返信
  2. ピンバック: wordpressトラブル奮闘記 – DEEPZ MODE

コメントを残す

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