エックスサーバーで運用している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 は上から順番に実行されます。トラブルを防ぐための黄金順序は以下の通りです。

  1. 環境変数・セキュリティ設定 (SetEnvIf, Header など)
  2. 外部リダイレクト (http→https、wwwの統一など、ブラウザのURLが変わるもの)
  3. 内部書き換え (ConcreteCMSやWordPressの index.php への転送など)

今回のケースはConcreteCMSでしたが、WordPressなど他のCMSでも全く同様のトラブルが発生する可能性があります。 エックスサーバーの便利な自動転送機能を使った後に「サイトが重くなった」「エラーが出る」という場合は、ぜひ .htaccess の記述順序を見直してみてください。