先日、WordPressで、久しぶりに頭を抱えるトラブルがありました。今回はその解決までの記録です。
サイトのURLをもう少し分かりやすくしようと思い、パーマリンク設定を「基本」から「投稿名」に変更しました。よくある設定ですし、特に問題ないだろうと。
ところが、設定を変えた途端、記事の更新ができなくなりました。画面の上には、赤いメッセージ。
「更新に失敗しました。返答が正しい JSON レスポンスではありません。」
設定を「基本」に戻すと問題なく保存できるので、原因がパーマリンクにあることは明らかでした。でも、なぜ?
まずは状況と環境の整理
トラブルシューティングの基本として、まずは自分の環境を整理しました。
- サーバー: 自宅のUbuntuマシンで動く Apache/2.4.58
- PHP: 8.3.6 (Apacheモジュールとして動作)
- 現象: パーマリンクを「投稿名」などにするとJSONエラーで投稿が保存できない。
- 特記事項:
mod_rewriteモジュールは有効になっていることをphpinfo()で確認済み。
エラーの正体を探る
エラーメッセージは「JSONが不正」と言っていますが、これは大抵、サーバーからの応答がそもそもおかしいケースです。
Chromeのデベロッパーツールを開いて通信を覗いてみると、やはり思った通りでした。記事の保存に使われるWordPressのAPI(/wp-json/で始まるURL)へのリクエストが、すべて**「404 Not Found」**を返していたのです。
つまり、サーバーがAPIのURLを見つけられずに「そんなページはありません」と応答していた、というのがエラーの正体でした。
原因は、サーバー側の「許可設定」だった
mod_rewriteモジュールは動いているのに、URLの書き換えができていない。
調べていくと、.htaccessファイルが怪しいと感じました。
自宅サーバーの設定ファイル(/etc/apache2/apache2.conf)を開いて、WordPressを置いているディレクトリ(/var/www/html)の設定を確認しました。すると、案の定、問題の箇所を発見しました。
<Directory /var/www/html>
AllowOverride None
</Directory>これは、.htaccessによる設定の上書きを**「一切許可しない」**というApacheの設定です。これでは、WordPressがパーマリンクのために書き出したリライトルールが完全に無視されてしまいます。APIのURLが見つからないのも当然でした。
※もちろん、その他の関連ファイル(sites-available)などで上書きされていることも考えられます。今回はこの修正で解決しました。
解決
原因が分かれば、あとは修正するだけです。
- Apacheの設定ファイルを編集AllowOverride None を、.htaccessを有効にする AllowOverride All に変更しました。
- Apacheの再起動設定を反映させるために、サーバーを再起動します。
- 最後に、WordPressの管理画面で「設定」→「パーマリンク」を開き、何も変更せずに**「変更を保存」**ボタンをクリック。これで、新しいサーバー設定のもとでリライトルールが再生成されます。
この手順の後、投稿を更新してみると、エラーはすっかり消え、無事に保存できるようになりました。
まとめ
結局、今回のエラーはWordPressの問題ではなく、サーバー側の非常に基本的な設定が原因でした。もし同じように、自宅サーバーやVPSでパーマリンクを変更した際にJSONエラーが出た場合は、プラグインを疑う前に、一度ApacheのAllowOverride設定を見直してみることをお勧めします。
まさか、サーバー側の基礎設定が原因だとは思わなかったです。※ワードプレスはそういったところは勝手に調整してくれるものだと思ってました。
今回は、エラーが解決するまで2時間近くかかってしまいました。
パーマリンクの問題なので、正直諦めてもよかったんですが、こうして終わってみると達成感がすごいですね。
最後まで見ていただきありがとうございました!!