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 がブロックされました」が出た時の対処法」への12件のフィードバック

  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

  3. アバターあき

    ロコモコ堂 フルタ様

    (勝手に)お世話になっております。

    一昨日から上記のログイン画面の症状が出ています。

    新しいサーバーに移行する作業が終わり、
    (目的は上記の質問者さんと同じSSL化です)
    いつものようにWordPressの管理画面に入りましたら、
    [エラー: 予期しない出力により Cookies がブロックされました。~]となりました。

    ’debug.log’の生成まで進みましたが、
    ファイル内を検索してもフルタ様がおっしゃるようなログが出てきません。
    これはイベントビューアで開いて確認していないのが原因でしょうか?
    (このあたり理解不足だと実感してます)
    ちなみに、サクラエディタで開いています。

    WordPress経験は、まだ2年足らずの初心者に毛が生えた程度です。
    たいへん恐縮ですが、ご教授いただけますと有難いです。

    サイトの公開は、フルタさんだけであれば可能です。
    ほかの情報も必要であればおっしゃってくださいm(__)m

    何とぞ、よろしくお願いいたします。

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

      コメント頂きまして、有難うございます。

      [エラー: 予期しない出力により Cookies がブロックされました。~]が表示されたのですね。
      お困りだと思います。

      まず’debug.log’の件ですが、デスクトップにダウンロードしたら、サクラエディタでも内容は見られる筈です。
      WordPressのログイン画面にアクセスして、何か問題が起きていれば、
       [29-Oct-2018 02:55:21 UTC] PHP Notice:〜
      の様に記録されます。
      もう一度WordPressのログイン画面にアクセスしてみてください。

      原因についてですが、SSL化でhttps://とhttp://とが混在しているからかもしれません。
      またWordPressの管理画面の、「設定」>「一般設定」の「WordPressアドレス」か「サイトアドレス」にhttp://が残っていたり、.htaccessでのリライト設定がhttp://になっているのかもしれません。

      返信
  4. アバターあき

    フルタ様

    ご返信、ありがとうございますm(__)m

    ご指示の通り、サクラエディタで進めましたら、
    [29-Oct-2018 02:55:21 UTC]のようにズラリと表示されました。

    そのなかに
    PHP Warning: Cannot modify header information~が
    全部で7箇所出てきました。

    >>‘PHP Warning: Cannot modify header information’ の記述が有れば、その後の
    ‘headers already sent by (output started at’ 以降にかかれているのファイルの行と前後に不正な文字・スペース・改行などが無いか調べる。

    とのことですが、7箇所すべての【at’ 以降】は、
    半角スペースと/で、次の行に送られています。

    とはいえ、それが不正かどうかは分かりませんが……。

    お手数ですが、引き続きご指導いただけますと有難いです。
    何とぞ、よろしくお願いいたします。

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

      ご返信、有難うございます。

      サイトのSSL化は手動ではなく、「さくらのレンタルサーバ 簡単SSL化プラグイン 」を使って行われたのでしょうか?
      サイトのトップページや投稿ページにはhttps://でアクセス出来るでしょうか?

      もしこのプラグインをお使いでしたら、ひとまず停止か削除し、http://で通常に表示されるか確認した方がいいかもしれません。
      正常に表示されるなら、手動でSSL化しては如何でしょうか。

      プラグインを停止させるには、管理画面で警告が表示されても、ひたすらユーザー名とパスワードを打ち込んでログイン操作をすれば管理画面に入れる事が有りますので、プラグインの一覧から停止させる事が出来たらいいのですが、
      駄目な場合、
      「さくらインターネット」の「コントロールパネル」に入って、左カラムの「運用に便利なツール」の『ファイルマネージャー」からファイルを操作するページに入り、wp-content > plugins > sakura-rs-wp-sslを削除する事になります。

      作業を行われる場合は、予測出来ないトラブルがあるかもしれませんので、自己責任でそれに備えてバックアップを取って行ってください。
      バックアップ無しにサイトが壊れると復元できなくなりますので。

      もうご覧になっているかもしれませんが、さくらインターネットのSSL化トラブルシューティングは、以下のページが詳しいです。

      https://help.sakura.ad.jp/hc/ja/articles/115000051662–WordPress-%E5%B8%B8%E6%99%82SSL%E5%8C%96%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

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

        と書いていたのですが、サクラエディターをさくらインターネットと読み違えて返信を書いてました。
        すみません。

        返信
      2. アバターあき

        ご返信、ありがとうございます。

        いいえ。サイトのSSL化は、
        ご指摘の「さくらのレンタルサーバ 簡単SSL化プラグイン 」ではありません。

        サーバーはヘテムルです。

        ヘテムルの無料SSL化は、
        ヘテムル内の旧サーバーから新サーバーに移設しないとできず、
        FTPソフト(FFFTP)を使って、
        手動でダウンロードとアップロードを行いました。

        WordPressのサイトは全2サイトのみ移行しましたが、
        そのうちのひとつだけ今回のログインできない状態になりました。
        (もうひとつのほうは無事にSSL化できました)

        ちなみに、バックアップは取っています。
        念のため、先ほど書き変えてアップロードしたwp-configも、
        心配なので元のファイルをアップロードし直しました。

        情報が後手後手になってしまい、申し訳ございませんm(__)m

        返信
        1. アバターあき

          たびたび、すみません。

          返信後に、読み間違いのコメントを確認しました。

          PS.これから外出してしまうので、明朝に確認させていただきます。
          ご相談させていただいている立場なのに、本当に申し訳ないですm(__)m

          返信
          1. アバターあき

            フルタ様

            WordPressの管理画面に入ることができました!

            たいへんお騒がせしました。

            貴サイトの当ページが頼りになりました。

            >>問題が無ければ、wp-config.phpとfunctions.phpを ‘UTF-8 BOM無し’ で保存しなおす。

            wp-config.phpのBOMのチェックを外して、アップロードしましたら例の「エラー:予期しない出力により~」が消え、管理画面に入ることができました。

            原因は特定できませんが、
            おそらく旧サーバーからローカルにダウンロードする際、
            ヘテムルで指定する「暗号化」ができず、
            通常とは違う形式でダウンロードしたことが引っかかります。
            この作業以外は、もうひとつのWordPressサイト(こちらは普通に開けました)となにも変わりはなかったので。

            とにかく当ページが本当に心強かったですm(__)m

          2. ロコモコ堂 フルタロコモコ堂 フルタ 投稿作成者

            解決できたのですね。
            良かったです。

            サイトの移動でファイルをダウンロードされたんですね。
            その時にアプリがBOMを付けたか、何か符号を入れたのかもしれませんね。
            phpファイルで’

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください