WordPressでサイトアドレスからwpを取りつつリダイレクトするのに苦戦した

元は以下のURL構造で長年運用されていたサイトを、/wpを取って欲しいという要望に対応した際の備忘録。Redirectionプラグインを使われていたのもあって結構苦戦した。

// 設定 > 一般
WordPressアドレス(URL): https://example.com/wp
サイトアドレス(URL): https://example.com/wp

サイトアドレスだけ変更する際の基本

今回はドメインの変更(これは新ドメインと紐づけたディレクトリへのWPのインストールと引越しが必要になる)ではなくて、あくまでディレクトリの変更。なのでWPの設定にてサイトアドレス(URL)を変更し、/wpに設置されている .htaccessindex.phpをコピーし、index.phpの一部だけ書き換えてルートに設置すればOK。

// index.php
// 省略
require( dirname( __FILE__ ) . '/wp/wp-blog-header.php' );  // ← /wpを追加してあげる

ルートにアクセスしてきた人はindex.phpが表示されるので、そこで/wp/wp-blog-header.phpを参照してねとWPの中身がある/wp配下を参照させてあげている。なおパーマリンク設定の更新をしないとバグるはず!詳しくは以下の記事参照。

https://yattokoo.com/wordpress-url-wp-delete

ちなみに、この時キャッシュプラグインなどの.htaccessに追記する系のプラグインはルートの方の.htaccessを編集するようになる。なので元々のサブディレクトリ側の.htaccessはなるべくまっさらなWPインストール直後の記述だけがある状態にしておいた方がいいと思う。

いざリダイレクト

サイトアドレスを変更するだけの記事は過去にGoogleにインデックスされた記事のリダイレクトの面倒までみていない記事が多かった。

まずは基本のリダイレクトのおさらい

これはドメインを変更する場合の例だが、こっちの方がわかりやすいのでこれを貼っておく。

RewriteEngine On
RewriteCond %{http_host} ^www.old.com
RewriteRule ^(.*) https://www.new.com/$1 [R=301,L]

RewriteRuleの行の末尾に$1があるので、元のドメインが変わってもその配下のパス(ディレクトリ)は引き継いでリダイレクトしてくれる。つまり「全部の昔の記事をトップページにリダイレクトしてしまう」とかじゃなく、ちゃんと新しい正規のURLに飛ばしてくれる。

https://www.itti.jp/web-design/htaccess-redirect/#chapter-10

WP管理画面を除いてリダイレクトする

今回こまったのはこれで上記の一般的なリダイレクトを参考に以下のようにリダイレクトルールを書くと、WP管理画面に入れなくなったり、wp-で始まるファイル群にアクセスできずにWP表示がおかしくなったり、wp-content配下にある画像URLまでリダイレクトされて画像が表示されなくなる(はず。あれ、そうだよね、WPがよしなにやってくれるからやる必要なかったとかはないはず…!)。

# 間違った書き方①
# これは /wp の .htaccess に書くことに注意
RewriteEngine On
RewriteBase /
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

## 間違った書き方②
# これはログイン画面や管理画面には入れるが画像参照先URLの/wpも取っちゃうので画像が表示されない…はず…
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^(.*)?wp-login\.php
RewriteCond %{REQUEST_URI} !^(.*)?wp-admin
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

なので結論を書くと以下の書き方をした。

# 正しい(とは言えんが想定通り動く)書き方
# これは /wp の .htaccess に書くことに注意
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^(.*)?wp-(.*)
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

正規表現でwp-が付くディレクトリはリダイレクトさせない設定とした。

注意すべきはこれはルートの.htaccessではなくて/wp.htaccessに記述すること!ルートの方に設置してしまうと当然自分自身へリダイレクトし続けてしまう。

ただ、改めて書くと「間違った書き方②」でよかったんじゃないか…?少し不安。

Redirectionプラグインのエラー

今回はたまたまRedirectionプラグインが入っていて、上記のサイトアドレスを変更したらおかしくなった。リダイレクトルールの一覧がいつまでたっても読み込まれず、ブラウザのDeveloper Tools のコンソールを見ると/wp-json/というファイルの取得に失敗し続けている。そのURLを新タブで開くと以下のエラーレスポンス。

{
code: "rest_cookie_invalid_nonce",
message: "Cookie チェック失敗",
data: {
status: 403
}
}

これは結論、WP管理画面から一度ログアウトして再度ログインすると治った。よくわからないがREST APIのエラーらしい。

参考サイト

https://monaga.site/how-to-redirect-without-admin-page/

https://www-creators.com/archives/248