« PTA会長としてのインタビュー | Home

Dec 252020

備忘メモ:WordpressでERR_TOO_MANY_REDIRECTS

WordpressトップページをWordpressインストールフォルダの親階層に展開したときに、ややこしいことになったのでメモ。(以後WordpressはWP表記)

前提条件とゴール

  • 既存WPあり。ドメインは仮に"hoge.com"。
  • サイトトップページ(https://hoge.com/)はWPで管理されていない静的html(/root/index.html)。
  • WPインストールディレクトリは"/root/wp/"、URLは"hoge.com/wp/"。
  • 個別投稿のパーマリンク設定は「数字ベース(https://hoge.com/wp/archives/123)」(Trailing Slash無し)。

これを継承して、以下仕様で拡張。

  • サイトトップページ(https://hoge.com/)をWP固定ページにする。
  • WP投稿ページは既存URLの"https://hoge.com/wp/"を継承。
  • 個別のWP投稿も既存URLを継承。

ディレクトリで見ると以下のような感じ。

# ディレクトリ構成
/root(https://hoge.com/)
├ index.php(サイトトップ:静的HTMLからWP固定ページに変更)
└ /wp(WPインストールディレクトリ)

サイトトップページをWP固定ページに変更する

まず、サイトトップページをWP固定ページにするために、WPトップページの展開場所を一階層上げる必要がある。
これは「"index.php"と".htaccess"の変更」「WPの「サイトアドレス(URL)」設定変更」で対応。

"index.php"と".htaccess"の変更

  1. WPインストールディレクトリ直下(/root/wp)から、"index.php"と".htaccess"をダウンロード。
  2. Index.phpを修正。
    変更前
    /** Loads the WordPress Environment and Template */
    require( dirname( __FILE__ ) . '/wp-blog-header.php' );
    変更後
    /** Loads the WordPress Environment and Template */
    require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );
    ※ 「wp」はWPインストールディレクトリ名
  3. .htaccessを修正
    変更前
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /wp/
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /wp/index.php [L]
    </IfModule>
    変更後
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
  4. 修正した"index.php"と".htaccess"を、"/root/"にアップロード。
    ダウンロードした"/root/wp/"直下の"index.php"と".htaccess"はそのまま。

WPの「サイトアドレス(URL)」設定変更

  1. WP管理画面の「設定」>「一般」に移動。
  2. 「サイトアドレス (URL)」にトップページの展開URLを入力(https://hoge.com)

これでサイトトップページ(https://hoge.com/)にWPトップページが展開されるようになる。

投稿ページを"https://hoge.com/wp/"に展開

続いて、WP投稿ページ(ブログ新着一覧)を"https://hoge.com/wp/"に展開する。
対応方法はいくつかあるのだけど、今回はWP管理画面からある程度見通せるようにfunction.phpでなく、テンプレートベースで設定。

  1. 「ホームページ」、「投稿ページ」のダミー固定ページそれぞれ作成。
  2. 「投稿ページ」ダミー固定ページのスラッグに"wp"を設定。
  3. WP管理画面「設定 / 表示設定 / ホームページの表示」で「固定ページ」選択して、「ホームページ」、「投稿ページ」に該当するダミー固定ページを指定。
  4. 「ホームページ」、「投稿ページ」それぞれのデフォルトテンプレートを追加
  5. 投稿ページのダミー固定ページのスラッグに"wp"を設定。

これで"https://hoge.com/wp/"にアクセスすると、以下エラーが発生してページが表示されない。

このページは動作していません
hoge.com でリダイレクトが繰り返し行われました。
Cookie を消去してみてください.
ERR_TOO_MANY_REDIRECTS

ネットワークのログを見ると、"/wp"と"/wp/"のリダイレクトループが発生している状態。コレに対する一般的な原因・対応は「WordPress「リダイレクトが多すぎます」問題の原因と解決方法【ERR_TOO_MANY_REDIRECTS】 - 俺のSEO対策」にまとめられているが、今回はおそらく「実ディレクトリと仮想ディレクトリ(スラッグ)が同名になっていることによる、処理のバッティング」が原因で以下のような感じになってるっぽい。

  • サーバ
    • ディレクトリ"/root/wp"に対するアクセスと認識。
    • "https://hoge.com/wp/"へ転送。
  • WP
    • スラッグ"wp"に対するアクセスと認識
    • "https://hoge.com/wp"へ転送。

固定ページのスラッグと同名のディレクトリを配置したい場合の対処法 | DO WP」を参考にしてみたが、どうにも挙動が安定しなかったため、以下のWPスラッグ設定の変更で対応。

  1. WP管理画面「設定 / 表示設定 / パーマリンク設定」に移動
  2. 「共通設定」で「カスタム構造」を選択して「https://hoge.com/wp/archives/123/」(Trailing Slash"/"を追加)

これで、WPも"http://hoge.com/wp/"を正しいURLとして認識し、サーバとWPでリダイレクト先が統一されてループが発生しなくなる。しかしその結果、「個別のWP投稿も既存URLを継承」条件が満たせずSEO的な損失を懸念したが、WPで元URLを勝手に301リダイレクトしてくれているっぽい感じ。

  • 元URL = https://hoge.com/wp/archives/123
  • 新URL = https://hoge.com/wp/archives/123/

しかしまぁ念のために、".htaccess"にも"https"へのリダイレクトに加えて、"Trailing Slash"への301リダイレクトを設定しておく。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_URI} !\.[^/\.]+$
RewriteRule .* %{REQUEST_URI}/ [R=301,L]
# RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]
</IfModule>

これで対応完了。

まとめ

  • WPインストールディレクトリと、WPのサイトアドレス (URL)は同名にしないほうが良い。
  • WPインストールディレクトリをURL展開するのはセキュリティ的にもよろしくない気がするので、以下のような設定にしておくのが良いかなーと思う。
    • インストールディレクトリ = /root/wordpress/
    • WPのURL = https://hoge.com/blog

Leave a comment

Search and Archives