WordPressサイトのURLを正規化したらリダイレクトループが発生した

この記事は最終更新から4年以上が経過しています。情報が古くなっている可能性があります。

こんにちは、しばです。
この間、WordPressサイトの一部のページでリダイレクトループが発生してることに気づきました。
どうやらhtaccessファイルに記述してたURL正規化とWordPressのパーマリンク設定が干渉してたようです。特定のページだったためしばらく気づかず。。

CMSサイトは特に気をつけねばと反省した1件だったので、今後のうっかりを防ぐため、原因と発生した経緯をまとめておきたいと思います。

特定のページでリダイレクトループが発生

まず事象が発生したサイトについて。
投稿ページが中心のブログサイトで、固定ページは自己紹介の1〜2ページある程度という構成です。

ある日、気づいたら固定ページとアーカイブページでリダイレクトループが発生。トップ・投稿ページは通常通り表示されるような状態でした。

Chromeブラウザのエラー画面には、「このページは動作していません。xxx(ドメイン名)でリダイレクトが繰り返し行われました。」との表示。
chromeの開発者ツールのネットワークパネルで、試しにページ送り先のページを見てみるとこんな感じ。

2→2/→2…をループしてエラーになっているようです。

原因はhtaccessの末尾スラッシュに関するコード

リダイレクト関連といえば、まず疑わしきはhtaccessファイル。
SSL対応ついでのURL正規化関係のコードを追記していたので、そこらへんかなーと思って見たところこんなコードがありました。

RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule ^(.*)$ $1/ [R=301,L]

このコードの内容は、末尾スラッシュなしのリクエストが来た時、スラッシュありにリダイレクトするというもの。
先ほどのループしているURLを考えると非常に怪しい。。

また、WordPressのパーマリンク設定を確認すると、投稿ページ以外はデフォルトの/%postname% 、そして投稿ページはカスタムで/%postname%.php としていました。
ついでに、WordPress側では標準で/なしへのリダイレクト設定が含まれてるようです。

以上から今回のリダイレクトループは、WordPress生成のページ(スラッシュ無しのURL)にアクセス→htaccessの設定によりスラッシュありにリダイレクト→それを受けてWordPress側の標準設定によりスラッシュ無しにリダイレクト…というのを繰り返し処理をしていた結果だったようです。
投稿ページは、htaccessのリダイレクト条件から外れるパーマリンクだったため問題なかった模様(´▽`;)

そのため、このコードを削除すると、無事リダイレクトループが解消。
他のページも閲覧できるようになりました!

WordPressで末尾スラッシュ有りで統一したい場合は、functions.phpを編集する

以上から、正規化という意味ならWordPressは標準でスラッシュなしで統一されるので何もしなくて問題ありません。

ただ、末尾スラッシュありで統一したい場合もあると思います。
その場合は以下をfunctions.phpに書けばOK!

function add_slash($uri, $type) {
  if ($type != 'single') {
    $uri = trailingslashit($uri);
  }
  return $uri;
}
add_filter('user_trailingslashit', 'add_slash', 10, 2);

※上記は投稿ページ以外にスラッシュを付与する場合のコード

URLの設計を踏まえて正規化を行おう

今回の事象はつい静的サイトと同じように正規化してしまったことで起こしてしまいました。
構築後に正規化設定したのと、投稿ページ側のリダイレクトを色々考えることがあったことでチェック漏れがあったんだと思いますが、気付けなかったのが非常に不思議で恐ろしい…(((°Д°;))))

「WordPress リダイレクトループ」は事例や原因がかなり多くて、あんまり今回の原因に当てはまるケースはないと思いますが、どなたかの参考になれば幸いです!