wordpress「予期しない出力により Cookies がブロックされました。」の対処方法まとめ

wordpress「予期しない出力により Cookies がブロックされました。」の対処方法まとめのイメージ レンタルサーバー

Cookies-are-blocked-due-to-unexpected-output

wp-login.phpにアクセスした際、
Cookies are blocked due to unexpected output、
または、予期しない出力により Cookies がブロックされました。
と表示されることがあります。

このエラー(「予期しない出力により Cookies がブロックされました。」)が発生すると、/wp-admin/にアクセスすると真っ白な画面になります。

また、wp-login.phpで正しいユーザー名、パスワードを正確に打ち込んでも、ログインできません。

このエラーが発生する理由

wp-login.phpにアクセスするとwp-login.phpの表示処理が実行されます。
また、「ログイン」ボタンをクリックしても同様にwp-login.phpが実行されます。

正常にログインできた場合、http://ドメイン/wp-admin/へリダイレクトします。
リダイレクトはheader(“Location: url”)関数を使っています。
HTTPヘッダのLocation: urlをレスポンスして応答しています。

「予期しない出力により Cookies がブロックされました。」エラーは、Location: ヘッダーを応答する前に何かしらの出力(標準出力)があった場合に発生します。

HTTPのプロトコルは、IETFで定められています。
https://tools.ietf.org/html/rfc2616#page-135
正常:Location:フルURL
違反: Location:フルURL
Header Field Definitionsは、行頭から始める決まりです。

wp-login.phpでは、
PHPの標準関数 headers_sent() HTTP ヘッダが送信済みかどうかの確認する関数でチェックしています。

空白(スペース)などたった1文字あるだけで、「予期しない出力により Cookies がブロックされました。」エラーが発生します。

ここまで、エラーが発生する理由をご説明してきました。
じゃどうして、Locationの前に出力されているのか、この要因は次に説明します。

「予期しない出力により Cookies がブロックされました。」エラーが発生する要因

ブラウザでwp-login.phpにアクセスした際、どんな処理が行われて、ログイン画面が表示されているのかご存知でしょうか?

wp-login.phpは、wp-load.phpを実行しています。
アクティブなプラグイン、現在選んでいるテーマ、これらを含めwordpress動作に必要なPHPファイルを読み込み処理しています。

この中で本来何も出力しないはずのPHPファイルが、変更や更新によって文字列を出力しているために発生する場合が多いです。

これから、要因をパターンに分けて、チェック方法と解決法をご紹介します。

パターン別「予期しない出力により Cookies がブロックされました。」のチェック方法と解決法

「予期しない出力により Cookies がブロックされました。」が発生し、wp-adminが真っ白になるパターンは、以下3つです。

  1. wordpress新規設置でログインできない
  2. 長い間wordpress放置でログインできない
  3. function.phpやテーマを改造したらログインできない

wordpress新規設置でログインできない場合のチェック方法と解決法

ワードプレスを新規に設置、wp-config.phpをローカルで書き換えてFTPアップロードしたらエラーになってログインできないというパターンです。

wp-config.php、または個別にアップロードしたphpファイルに文字コードの問題がある場合が多いです。

【チェック方法】

LinuxやMacをご利用ならfileコマンドで文字コードを確認できます。

% file wp-config.php
wp-config.php: PHP script, UTF-8 Unicode (with BOM) text

このようにwith BOMとある場合、「予期しない出力により Cookies がブロックされました。」が発生します。

ローカル(PC)にPHPがインストール済みなら、php wp-config.phpを実行してみてください。

% php wp-config.php

実行結果にスペースが出力されていないことを確認してください。
BOM付きファイルは先頭に制御コードが入っています。phpではこの制御コードをテキストとして出力します。
見た目はスペースですが、実際はbbef00bfが出力されています。

【解決法】

BOMあり、BOMなしを指定できるエディタでwp-config.phpを再編集してください。

UTF-8 (BOMなし)で保存したものをFTPでアップロードしてください。

長い間wordpressを放置していた場合のチェック方法と解決法

ワードプレスのバージョンが古い状態で使い続けているとログインできなくなる場合に遭遇します。
最新のwordpressを入手し、上書きすることでログインできるようになります。

現在ご利用中のワードプレスのバージョンは、
wp-includes/version.phpの$wp_version変数で知ることができます。

ちょっと焦ってしまい、古いから上書きアップデートという手段をとってしまうため詳しいチェック記録を取っていないので、チェック方法はありません。
かなり古いバージョンだった場合の手段として参考にしてください。

wordpressのアップデート前にバックアップしてください。

日本語版wordpressはhttps://ja.wordpress.org/より入手できます。

【解決法】

sshでログインできる方は、
sshでサーバーへログインし、最新版をダウンロードします。

一括展開できるように
適当なフォルダにwordpressを展開し、フォルダ名をwordpressからお使いのwordpressフォルダ名に変更します。

tar cvzf ./new-wordpress.tar.gz ./変更したフォルダ名

お使いのwordpressフォルダの1つ上のフォルダにcdし、上書き解凍します。
tar xvzf path-to/new-wordpress.tar.gz

sshでログインできない環境の方は、FTPでアップロードしてください。

function.phpやテーマを改造したらログインできない場合のチェック方法と解決法

wordpressからログアウトして、再度ログインする際、「予期しない出力により Cookies がブロックされました。」エラーが発生するので、さっきまでログインできたのに・・・なぜ?ってなります。

【チェック方法】

何かしらの文字が出力されてしまう原因は、UTF-8(BOM付き)のPHPファイルにしてしまった、?>でPHPコードを閉じた後にスペースやタブが存在する、echoやprint_r、var_dumpなどの出力をしているなどです。

ひとつ一つPHPファイルをチェックするのは数も多く非効率です。

ファイルの更新日付が新しいものに絞ってチェックしていきます。

ここでは、sshでログインできる環境のチェック方法です。FTPしか使えない環境では、ローカル(PC)にPHPをインストールし、ローカル(PC)で確認してください。

ファイルの更新日付が新しいものを列挙する方法
$ find . -mtime -3 -name “*.php”
カレントディレクトリからディレクトリをたぐってここ3日間の間に変更されたファイルを列挙します。
-1で1日間に変更することができます。

列挙されたファイルを1つずつphpで実行し、余計な文字を出力しているPHPファイルを特定します。
$ php wp-config.php

phpコマンドは、契約しているレンタルサーバーによって使えるバージョンが異なります。
エックスサーバー:すべてのバージョンが使える
さくらインターネット:現在アクティブのPHPが使える

エックスサーバーの場合は、ログインできないドメインでアクティブにしているPHPのバージョンを確認し、
$ php7.1 wp-config.php
のようにバージョンを指定し実行してください。

【解決法】

余計な文字を出力しているPHPファイルを特定できたかと思います。
BOM付きになっていないか、
?>の後に空白やタブがないか、
無条件にechoなどで出力している箇所がないかを確認して、余計な文字を出力しないように修正します。

まとめ

いかかがでしたでしょうか、wordpress「予期しない出力により Cookies がブロックされました。」の対処方法まとめとして、

  • このエラーが発生する理由
  • 「予期しない出力により Cookies がブロックされました。」エラーが発生する要因
  • wordpress新規設置でログインできない場合のチェック方法と解決法
  • 長い間wordpressを放置していた場合のチェック方法と解決法
  • function.phpやテーマを改造したらログインできない場合のチェック方法と解決法

をご紹介してきました。

このエラーの原因を特定する方法にWP_DEBUGを有効にしてログを確認する方法がありますが、余計な文字が出力される場合はログに全く記録されません。

プラグインのフォルダ名や使っているテーマフォルダ名を変えてみてログインできることを確認する方法は、
稼働中のサイトの場合、インパクトが大きいのでオススメできない方法です。

基本的なUNIXコマンドを覚える手間はありますが、今回のようなエラーが発生した場合、
sshログインできるレンタルサーバーだと原因を素早く特定し、対象することができます。

UNIXの基本がうまくまとまっているサイト:これだけは覚えておきたい!基本的なUNIXコマンド20【初心者向け】

これ以外にvi(ファイル編集コマンド)の基本操作を覚えたいところです。
vimtutorコマンドがあれば、実行してみてください。基本的な操作が学べます。
Webでまとまっているサイトはvi の基本的なコマンドです。

コメント

タイトルとURLをコピーしました