WordPressで記事を更新しようとしたら「更新に失敗しました。返答が正しいJSONレスポンスではありません。」とエラーが出るようになりました。
サーバー構築環境
サーバーの構築環境はこんなカンジです。
解決のために試したこと
今まで問題なく更新できていたのに突然です。公開はもちろん下書きの状態でも反映されません。
検索すると同じような症状で困っている記事がたくさんありました。
色々な記事を参考にして、次のことを試しても改善せず。
- パーマリンクの設定をリセット
- .htaccessは「apache」が書き換え可能な権限にする
- ネットを一度オフにして再度接続
今回、最大の特徴はJavaScriptのコードを記事に記載するとエラーが発生することでした。
またGutenberg(グーテンベルク)ではなく、旧エディタに戻しても更新可能です。
.htaccessが原因ではなさそうです。
原因はファイアーウォール(WAF)
結論からいうと原因はWAF(Web Application Firewall)でした。
サーバーに『SiteGuard Light』というソフトウェアをインストールしたんですが、こちらの検査に引っかかってました。
早速『SiteGuard Light』の管理画面でログを確認してみます。
案の定ブロックされてました(笑)IPアドレスは全て自分のアクセスでした。原因はこれで間違いないようです。
シグネチャを検査から除外する
検出名(シグネチャというらしいです)は全て「RULE_SIG」です。これを検査から除外すればOKな訳です。
.htaccessにシグネチャやアクセス元IPアドレスを記載して除外する方法もありますが、今回は『SiteGuard Light』の管理画面から設定します。
①モジュール設定→②カスタム・シグネチャ→③追加の順番でクリックします。
シグネチャ登録画面で「シグネチャ名」に先程のRULE_SIG、「動作」を安全に設定します。
一応コメント欄にもわかりやすい説明を設定します。
これでも問題ないと思いますが、全てのRULE_SIGを除外するのもセキュリティ的に問題がありそうなので、接続元IPアドレスを設定して制限します。
「条件追加」をクリックします。
検査対象を「接続元IPアドレス」、検査文字列の欄に現在自分が使用しているIPアドレスを入力します。正規表現なので「.」をエスケープするのを忘れずに。。
IPアドレスの調べ方
インターネットに接続しているIPアドレスは次のようなサイトで調べることができます。
また、WordPressに『SiteGuard WP Plugin』プラグインを入れている場合、ログイン履歴から調べることもできます。
話がそれますが、サーバーにインストールした『SiteGuard Lite』とWordPressに追加した『SiteGuard WP Plugin』は別物です。ちょっとややこしい。。
シグネチャを除外する設定を完了させる
最後に「適用」をクリックすればすぐに反映されると思います。
.htaccessで除外する場合
最後に、.htaccessで除外する方法もメモしておきます。
これらをファイルに追記してFTPアップすれば反映されるようです。
シグネチャ除外
<IfModule mod_siteguard.c>
SiteGuard_User_ExcludeSig RULE_SIG
</IfModule>
IPアドレス除外
<IfModule mod_siteguard.c>
SiteGuard_User_ExcludeSig ip(198.51.100.1)
</IfModule>
参考URL
まとめ
今回、接続元IPアドレスを指定して除外しました。
プロバイダによっては接続の度にIPアドレスが変更になる場合があります。家や会社だけでなく、外出先でアクセスした場合でも同様です。
その場合、都度IPアドレスを追加しなければいけない訳ですね。。
今回の場合、更新するユーザーが私だけなので問題ありませんが、複数人数で更新するサイトの場合、運営方法を考える必要があるかなー。と思いました。
こればっかりはセキュリティとの折り合いなので仕方ないでしょうか。。