発端は、長らくバージョンアップを放置されていたサブディレクトリ型マルチサイト設定の WordPress をバージョンアップして、Contact Form 7 もバージョンアップしたら動かなくなったという問い合わせから。
Contact Form 7 Ver.4.8 からは、Ajax フォーム送信時に WordPress REST API を使用するようになったので、それが原因で動作しなくなっていたのでした。
私のサイトでは REST API が無効化されています。Contact Form 7 を使うことはできますか
ただ、このサイトでは JSON REST API を無効にするようなプラグインとか入れていたわけではないのですが、/wp-json/contact-form-7/v1/contact-forms/4/feedback
へのリクエストが 500 (internal server error)
を返してしまい、送信できないような状態。
Apache のログ見ると、どうやらリダイレクトループが発生しているようです。
[Fri Dec 08 21:05:41 2017] [error] [client xxx.xxx.xxx.xxx] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: http://example.com/hoge/contact/
ってことで、codex を確認。htaccess
はい、もう答えが書いてありましたね。
WordPress マルチサイト版では、JSON REST API 導入前後で .htaccess の記述方法が変わります。
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
肝は RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
以前は、これ RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-.*) $2 [L]
だったはず。
古いバージョン用の .htaccess だと、/{子サイト}/wp-json/*
へのリクエストがリダイレクトループしちゃうんです。
怪しげな2次情報とか調べずにまずは codex やプラグインのサポートサイトを調べましょうというお話でした。