まだ作ったばかりで中身スッカスカです

.htaccessが原因でリダイレクトループに(XServer)

リダイレクトが止まらない!

Q
リダイレクトループが原因でサーバーがエラーログだらけです!(涙)
A

リダイレクト設定に問題があると無限ループに陥り様々なエラーが発生します。

リダイレクトループはhtttpからhttpsへの転送などが無限ループに陥る現象。
リクエスト多発により429エラー(サーバーが制限をかけた状態)も発生します。

WPのテーマやプラグインの不具合の他に.htaccessの記述に問題がある場合も。
直すには.htaccessを手作業で修正する必要があります。

サーバーに大量のエラーログ

いつの頃からか大量のエラーログが記録されるようになりました。リクエスト多発で429エラー(Too Many Requests)も起こしてましたが、原因はリダイレクトループにあるようです。

定石通りテーマを変えたりプラグインを止めても改善せず。WP-Cronを止めても効果なし。リダイレクト設定はサーバーパネルからスイッチで有効化したものなので記述に問題はないはずです。

頭を抱えてましたが、ついにヒントとなる記事を発見! どうやら.htaccessの記述順序が問題らしい。

サーバーパネルからの設定が原因

XServerではリダイレクトやSSL化はサーバーパネルから設定出来ます。しかしここで設定すると.htaccessの先頭に置かなければならないリダイレクト設定が、なぜか末尾に追加されてしまい、それが原因でリダイレクトに失敗します。

以前は下のように.htaccessを直接手作業で編集する必要がありました。その後サーバーパネルから設定出来るようになり、そちらで有効化するようになってからエラーが出始めました。

リダイレクト設定の記述順序を変更

困ったもんですが、直すにはサーバーパネルにある.htaccess編集画面か、ファイルマネージャで.htaccessを直接開いて手作業で修正するしかありません。作業は簡単です。

修正前(エラー状態)

緑色の部分はキャッシュやコメントに関する設定です。赤字の部分はリダイレクト設定です。末尾に記述されてるリダイレクト設定を先頭部分に移動します。

SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_AllCacheMode
SetEnvIf Request_URI ".*" WpCommentDeny
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
### BEGIN XPageSpeed - Do not edit the contents of this block! ###
XPagespeed on
<IfFile /var/xpagespeed/xpagespeed_ctl>
XPagespeed off
</IfFile>
### END XPageSpeed - Do not edit the contents of this block! ###
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

修正後(正常動作)

これが本来の順番です。以前はこの記述で問題なく動いてました。黒字の部分はWordPressやサーバーが自動的に記述する部分なので触らない方がいいです。

SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_AllCacheMode
SetEnvIf Request_URI ".*" WpCommentDeny
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
### BEGIN XPageSpeed - Do not edit the contents of this block! ###
XPagespeed on
<IfFile /var/xpagespeed/xpagespeed_ctl>
XPagespeed off
</IfFile>
### END XPageSpeed - Do not edit the contents of this block! ###

リダイレクトの動作チェック

リダイレクトが機能しているかチェックするにはツールを使うといいです。ネットで検索すると下記のようなリダイレクトチェッカーが提供されています。

これでhttp(非SSL)やwww付きのサイトアドレスを入力して動作確認。ちゃんとリダイレクト先に繋がれば問題ありません。リダイレクト設定に問題があればエラーが表示されます。

エラーのまま放置はよくない

.htaccessを修正したらログを埋め尽くしていた大量のエラーはすべて消えました。

今回の件はXServer固有の問題ですが、他のサーバーでも参考になるかもしれません。文字列は異なるかもしれませんが、基本的にリダイレクト設定は先頭に記述しなければいけません。

それにしてもサーバーパネルで自動設定した.htaccessに問題があるとは思いませんよね。これで頭を抱えてる人は多いんじゃないでしょうか。.htaccessを読み書き出来る人はそう多くないので。

不具合があっても一時的なエラーなのでサイトヘルスには良好と出てしまいブログは動き続けます。そのため放置でおk!なんて言ってる人もいましたが、連鎖的に他の不具合を引き起こしエラーが多発、検索エンジンも上手く巡回出来ずSEO的にも不利になります。

参考

送信中です

×

※コメントは最大500文字、5回まで送信できます

送信中です送信しました!