WordPressの投稿画面で更新しようとしたところ、「返答が正しい JSON レスポンスではありません」というエラーに遭遇しました。
調べたところこのエラーはさまざまな原因で引き起こされるということですが、今回のケースはややレアで、既出のいずれの解決策でも上手くいきませんでした。
結論としては、WordPressをホスティングしているApacheサーバーが、.htaccessファイルをオーバライドせずリダイレクトを行っていないことが原因で、apache2.confファイルを書き換えることで解決しました。
あまりないケースで、このような状況下の解決策の情報は少ないかと思いますので、状況や解決にいたった経緯を書き残しておきます。
環境
- Apacheサーバーでホスティング
- WordPressはサブディレクトリdomain.com/subにインストール
- サイトURLもdomain.com/subをルートとしている
- それに伴って、Apacheサーバー /var/www/html/sub/に.htaccessファイルを設置してリダイレクトを指定済み
エラー状況
・パーマリンク設定がdomain.com/sub/category/postname
→エラー
・パーマリンク設定がdomain.com/sub/category/post_id
→エラー
・パーマリンク設定がdomain.com/sub/?p=123
→正常に更新できる
つまり、サブディレクトリ内のルート domain.com/sub/ 形式だと問題ありませんが、それ以下の階層を操作しようとするとエラーになるということです。
おそらく勘の良い人ならこの時点で「サブディレクトリ設置の際に必要となるリダイレクト設定が機能していないのでは?」と気が付くかもしれません。
私も可能性は考慮しましたが、.htaccessファイルは存在して中身も確認済みですし、ブラウザでdomain.com/sub/にアクセスしてみるとトップページが正常に表示されたので、「.htaccessは機能しており、リダイレクトも正常に行われているはず」と考えました。結果的にはこれが誤りで、「.htaccessファイルは存在して記述は正しいのにリダイレクトが行われていない」ことが原因でした。
正常なリクエスト・レスポンスの仕組み
具体的な原因や解決策の説明の前に、少しWordPressの記事編集の仕組みをおさらいしておきます。私の場合、整理することで問題点が分かりやすくなりました。
WordPressの投稿画面で編集などのアクションを行うと、以下のようなパスに対してリクエストを送信し、
domain.com/wp-json/wp/v2/types/post
サーバー側でリクエストが正常に処理されるとWordPressがレスポンスを受け取り、「更新済み」といった形でユーザーに通知を行います。
ただし、サブディレクトリを使っている場合は注意が必要で、ルートのパスは /subであるため、リクエストは以下のように変更する必要があります。
domain.com/sub/wp-json/wp/v2/types/post
原因特定にいたったヒント
domain.com/sub/ のページは正常に表示されていましたが、domain.com/sub/category/hogeのように下層パスにアクセスすると常に「Apatch側のサーバーエラー」が返される状況でした。通常、WordPressが正常に機能していれば、該当ページあるいはWordPressで設定した404ページが返されるはずです。それにもかかわらずApache側がエラーを返すのは奇妙で、あと考えられるとすれば、「Apacheに.htaccessファイルが認識されていない」可能性に思い当たりました。
原因
Apacheの設定を確かめるべく、GCPのVMインスタンスにSSHでアクセスして/etc/apache2/apache2.confファイルを確認。
すると、以下のように、オーバーライドが「None」という設定であることが分かりました。
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
これが原因で、.htaccessファイルが存在しているにもかかわらずリダイレクトが行われていませんでした。
その結果、投稿画面で更新した時に本来なら以下にリクエストを送信すべきところ、
domain.com/sub/wp-json/wp/v2/types/post
実際には存在しない以下のパスにリクエストを送信しており、
domain.com/wp-json/wp/v2/types/post
Apache側がエラーを返していたというわけです。
解決策
apache2.confファイルにて、「None」を「All」などに書き換え、
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
サーバーを再起動すると、
sudo systemctl restart apache2
JSONレスポンスエラーは無事に解決されて更新できるようになり、下層パスで存在しないページにアクセスしてもWordPressの404ページが表示されるようになりました。
今後に向けたヒント
WordPress管理画面からサーバーにアクセスするまでのフローを正確に押さえると、問題の切り分けがしやすくなるかと思いました。
今回のようにサブディレクトリを使用すると原因の候補が多く複雑になりますが、①WordPress管理画面からリクエスト送信→②更新用パスへのルーティング→③Apacheサーバー側・DB側での処理&レスポンス送信→④WordPress側でレスポンス受け取り というフローを理解しつつ、以下のようなチェックをしていくと原因に素早く辿り着けそうです。
- WordPressそのものは動作しているか?
- WordPressの更新用パス(/about/wp-json/wp/v2/…)にアクセス可能か?
- .htaccessファイルで意図したリダイレクトが実行されているか?
- .htaccessファイルが正しいディレクトリに存在しており記述は正しいか?
- そもそも.htaccessファイルはApacheに認識されているか?
感想
WordPress運用で手軽なのはレンタルサーバーでサポートも初心者にも優しい操作性も魅力ですが、GCPでデプロイしているWebアプリのサブディレクトリにWordPressを利用したいのでルーティング上の理由で(仕方なく?)Compute Engineにデプロイしています。
今回のようなエラーが発生した場合は自分でApacheやWordPressの仕組みから調べて原因を特定するしかなく、記事を書き始めるまでが大変でしたが、無事にできて一息ついています。