【エックスサーバー】サイトが急に重い?「AH00124」エラーの原因と.htaccessの正しい書き方
エックスサーバーで運用しているConcreteCMSのサイトが、ある日突然「動作が異常に重い」と感じるようになりました。
サーバーのエラーログを確認したところ、以下のようなエラーが大量に発生。
[core:error] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.
このエラーは、「Apacheの内部リダイレクトが上限(10回)を超えた」、つまり処理がループしてしまっていることを示しています。 今回は、このエラーの原因と、解決するための「.htaccessの正しい記述順序」について解説します。
エラーの原因:Xserverの新機能と記述順序の競合
原因を調査したところ、昨年末にエックスサーバーの「ドメイン設定」機能に追加された、「www転送設定」と「HTTPS転送設定」を有効にしたことがきっかけでした。
これらの機能を管理画面から有効にすると、サーバー側で自動的に.htaccessへ設定コードが追記されます。しかし、追記される場所が「ファイルの一番下」だったことが問題でした。
ConcreteCMSなどのCMSでは、.htaccessを使ってURLを内部的に書き換える処理(プリティURL設定)を行っています。この既存の処理の後にリダイレクト設定が追加されたことで、サーバー内部での処理が無限ループに陥り、サイトの動作を遅くさせていたのです。
修正前のコード(NG例)
自動追記されたコードが一番下に来てしまい、CMSの処理と競合しています。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# ここでCMSの内部書き換えが行われる
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
</IfModule>
# 古いリダイレクト設定(mod_alias)
Redirect permanent /news.html https://www.example.com/news/
# Xserverによって「一番下」に追加されたコード
# これが原因でループが発生
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
修正後のコード(解決策)
エラーを解消するには、「URLの正規化(HTTPS化やwwwの有無)」を最優先にし、CMSの内部書き換えを最後に記述するよう順番を整理します。キャッシュ設定のSetEnvIfは動作に影響を与えないよう、ブロックの外や整理された場所に配置します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# 1. HTTPS & WWW の統一(最優先:ブラウザのURLを変える処理)
# HTTPをHTTPSへ、かつ wwwなしをwwwありに統一
RewriteCond %{HTTPS} !on [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R=301,L]
# 2. 特定ページの個別リダイレクト
RewriteRule ^news\.html$ https://www.yourdomain.com/news/ [R=301,L]
RewriteRule ^blog/index\.html$ https://www.yourdomain.com/blog/ [R=301,L]
# 3. CMSの内部書き換えルール(最後に実行)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteCond %{REQUEST_FILENAME}/index.php !-f
RewriteRule . index.php [L]
</IfModule>
# 4. サーバー環境変数の設定(キャッシュ設定など)
SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_AllCacheMode
まとめ:トラブルを防ぐ .htaccess の記述順
.htaccess は上から順番に実行されます。トラブルを防ぐための黄金順序は以下の通りです。
- 環境変数・セキュリティ設定 (
SetEnvIf,Headerなど) - 外部リダイレクト (http→https、wwwの統一など、ブラウザのURLが変わるもの)
- 内部書き換え (ConcreteCMSやWordPressの
index.phpへの転送など)
今回のケースはConcreteCMSでしたが、WordPressなど他のCMSでも全く同様のトラブルが発生する可能性があります。
エックスサーバーの便利な自動転送機能を使った後に「サイトが重くなった」「エラーが出る」という場合は、ぜひ .htaccess の記述順序を見直してみてください。
