サイトヘルスのREST APIエラー|3種類の表示の違い

WordPressのサイトヘルスに出る「REST API で予期しない結果が発生しました」は、WordPressが自分のサーバーへREST APIの確認を送り、200(成功)以外の応答が返ってきたという意味です。原因は、その下に出る「REST API レスポンス」の数字でほぼ見分けられます。

似た表示に「REST API でエラーが発生しました」「REST API は正しく動作しませんでした」があります。3つは失敗した段階が違うので、対処も変わります。

(確認:WordPress本体のソースコード wp-admin/includes/class-wp-site-health.php と、日本語の翻訳ファイル(WordPress 6.8.3)で確認しています)

サイトヘルスは何を確かめているか

サイトヘルスのREST APIの確認は、WordPressのサーバーが、自分自身に向けて次のURLへアクセスするものです。

https://(あなたのサイト)/wp-json/wp/v2/types/post?context=edit
  • ログイン中の管理者の情報(Cookie と、REST API用の確認コード)を付けて送る
  • 10秒で応答が無ければ打ち切る
  • 返ってきた中身に、権限の情報(capabilities)が入っているかまで確かめる

WordPress本体の説明では、REST APIは「WordPressと他のアプリケーションがサーバーと通信する方法の1つ」で、ブロックエディターの画面も投稿の表示と保存にREST APIを使っています。そのため、この確認が失敗していると、投稿の保存や外部からの投稿も失敗することがあります。

3つの表示の違い

表示 何が起きたか 下に出る情報
REST API でエラーが発生しました 通信そのものが失敗(接続できない・10秒で応答が無い) エラーコードとメッセージ(例:cURL error 28)
REST API で予期しない結果が発生しました 応答は来たが、200以外だった HTTPの数字(例:(403) Forbidden)
REST API は正しく動作しませんでした 200で返ったが、中身に権限の情報が無かった —

問題が無い時は「REST API が利用可能です」と表示されます。

「予期しない結果」は数字で見分ける

サイトヘルスの詳細を開くと、次のような行があります。

REST API エンドポイント: https://…/wp-json/wp/v2/types/post?context=edit
REST API レスポンス: (403) Forbidden

括弧の中の数字が、サーバーが返した応答の番号です。

数字 意味 よくある原因
403 アクセスを拒否された サーバーのWAF(不正アクセスを防ぐ機能)、セキュリティ系プラグインのREST APIの制限
401 認証が通らない サイト全体にかけたBasic認証、ログイン状態を扱うプラグイン
404 そのURLが無い パーマリンクの設定・.htaccess の書き換えで /wp-json/ へ届かない
500番台 サーバー側でエラー プラグイン・テーマのPHPのエラー、サーバーの一時的な不調

WordPress本体は、サイト全体にBasic認証がかかっている場合、その情報も付けて確認を送る作りになっています。それでも401になる場合は、プラグイン側の制限を疑います。

403の場合:サーバーとプラグインを順に疑う

  1. セキュリティ系プラグインを一時的に止めて、サイトヘルスを開き直す。直ればそのプラグインのREST APIの設定を見直す
  2. 直らなければ、サーバーの管理画面のWAFを一時的に止めて確かめる。止めたままにせず、原因が分かったら戻す

エックスサーバーの場合の確認の場所はエックスサーバーでREST APIが403になる時の確認にまとめています。

404の場合:パーマリンクを保存し直す

「設定」→「パーマリンク」を開き、何も変えずに「変更を保存」を押すと、URLの書き換えの設定が作り直されます。それでも直らない場合は、.htaccess が書き換えられていないかを確認します。

自分のブラウザで確かめる方法

サイトヘルスはサーバーから自分自身への確認なので、ブラウザから見た結果とは違うことがあります。切り分けのために、ブラウザで次の2つを開いてみてください。

  • https://(あなたのサイト)/wp-json/ — サイト名などが並んだ文字(JSON)が出れば、REST API自体は動いている
  • https://(あなたのサイト)/?rest_route=/ — 上が404でもこちらで表示されるなら、URLの書き換え(パーマリンク・.htaccess)の問題

ブラウザでは表示されるのに、サイトヘルスだけ失敗する場合は、サーバーが自分自身へアクセスする時だけ止められています。WAFや、サーバーから外への通信の制限を疑います。

「エラーが発生しました」の場合

こちらは応答の番号すら返っていない状態です。よく見るのは cURL error 28(時間切れ)で、10秒以内に自分自身から応答が返らなかったことを示します。

  • サーバーが重い、または一時的な不調(時間を置いて開き直す)
  • サーバーが自分のドメインの場所を正しく引けない(ドメインの移管・サーバーの移転の直後など)
  • 重い処理をするプラグインが、確認のたびに動いている

同じサイトヘルスに「ループバックリクエスト」の警告も出ている場合は、同じ原因のことが多いです。

放置してよいか

ブロックエディターで投稿を保存でき、外部から投稿する仕組みも使っていないなら、急ぐ必要はありません。ただし、次の場合は直しておく必要があります。

外部から投稿した時に出るエラー別の切り分けはWordPress自動投稿でよくあるエラーと切り分け方にあります。

当サイトで販売しているAmazon Auto Postsも、自分のパソコンからWordPressのREST APIを通して投稿する仕組みです。導入前に確認することはAmazon Auto Posts 導入前に確認することにまとめています。

まとめ

  1. サイトヘルスは、サーバーから自分自身へ /wp-json/wp/v2/types/post?context=edit を確認している(10秒で打ち切り)
  2. 「エラーが発生しました」=通信の失敗、「予期しない結果」=200以外、「正しく動作しませんでした」=中身が違う
  3. 「予期しない結果」はレスポンスの数字で見分ける。403はWAF・セキュリティ系プラグイン、404はパーマリンク
  4. ブラウザで /wp-json/ と /?rest_route=/ を開くと、原因の場所を絞れる