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”の変更
- WPインストールディレクトリ直下(/root/wp)から、”index.php”と”.htaccess”をダウンロード。
- 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インストールディレクトリ名 - .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> - 修正した”index.php”と”.htaccess”を、”/root/”にアップロード。
ダウンロードした”/root/wp/”直下の”index.php”と”.htaccess”はそのまま。
WPの「サイトアドレス(URL)」設定変更
- WP管理画面の「設定」>「一般」に移動。
- 「サイトアドレス (URL)」にトップページの展開URLを入力(https://hoge.com)
これでサイトトップページ(https://hoge.com/)にWPトップページが展開されるようになる。
投稿ページを”https://hoge.com/wp/”に展開
続いて、WP投稿ページ(ブログ新着一覧)を”https://hoge.com/wp/”に展開する。
対応方法はいくつかあるのだけど、今回はWP管理画面からある程度見通せるようにfunction.phpでなく、テンプレートベースで設定。
- 「ホームページ」、「投稿ページ」のダミー固定ページそれぞれ作成。
- 「投稿ページ」ダミー固定ページのスラッグに”wp”を設定。
- WP管理画面「設定 / 表示設定 / ホームページの表示」で「固定ページ」選択して、「ホームページ」、「投稿ページ」に該当するダミー固定ページを指定。
- 「ホームページ」、「投稿ページ」それぞれのデフォルトテンプレートを追加
- サイトトップ = “front-page.php”
- 投稿ページ = “home.php”(archiveテンプレートをまるっと適用)
- ※テンプレートヒエラルキー仕様は”Template Hierarchy | Theme Developer Handbook | WordPress Developer Resources“を参照
- 投稿ページのダミー固定ページのスラッグに”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スラッグ設定の変更で対応。
- WP管理画面「設定 / 表示設定 / パーマリンク設定」に移動
- 「共通設定」で「カスタム構造」を選択して「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>
これで対応完了。