マルチサイトでWordPressを設定して以降、ずっと次のようなエラーに悩まされていました。
AH00124: 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.
エラーログにはこれ以上の情報が無く、仕方が無いのでアクセスログと同時に監視して問題あるURLを突き止めてみたところ、どうやら以下のURLへのアクセス時にエラーログが記録されているようでした(ページの表示は「500 Internal Server Error」)。
- 存在しないページのURL
- URLが「.php」で終わる
このURLは移行前の旧ブログでのURLだと思われます。移行にあたって旧URLは全く考慮しないことに決めたので、確かにこのURLは存在しないのですが、しかしだとすれば「404 Not Found」になるはずで、「500 Internal Server Error」になるのはおかしいし、ましてやリダイレクトするのもおかしい。長らくいろんな設定を変えて試してみたのですが、わからずじまいでした。
問題は公式に記述されたhtaccessの内容にあった
WordPressでサイトネットワークを作成した時に、htaccessファイルに以下のような内容を記述するように指示されました。これをそのままコピペして使用していたわけですが、問題はこの中の12行目。
RewriteRule ^(.*\.php)$ $1 [L]
この部分、そのまま解釈すれば
「.php」で終わるURLはそのURLにリダイレクト
ということであり、ループの原因はまさにこれです。いやほんとこれ何のためにあるんだろう。WordPressではブログ上では「.php」は使われず、管理アプリでのみ使われています。例えば「.php」で終わるURLを「.php」なしにリダイレクトしたいというのであれば、
RewriteRule ^(.*)\.php$ $1 [L]
となるはずです。こうしても管理アプリには影響は出ません(なぜならファイルが存在してるからこのRewriteRuleまで来ない)。でもそういうことじゃないんですよね、多分。
色んなサイトを見てみるとこの部分は本来、
RewriteRule ^(.*\.php$) wp-dir/$1 [L]
となって、任意のディレクトリ以下を表示するような設定になっているみたいなんですけど、僕の場合トップディレクトリにWordPressをインストールしてるからこうなってしまってるのか。つまり僕の環境ではこの部分は必要ないってことですね。なるほど。
試しにこの部分をコメントアウトしてみたところ、「500 Internal Server Error」となっていたURLは無事「404 Not Found」になりました。もちろんエラーログの「Request exceeded the limit of 10 internal redirects」も消えました。
おお、解決した!