問題
WordPressサイトのディレクトリを変更したので、.htaccessで旧アドレスをリダイレクトしようとしたが、.htaccessの設定が全く反映されない
状況
WordPressで構築したサイトのアドレスを
https://example.com/blog/
から
https://example.com/
に変更したので、旧アドレス(各記事やカテゴリ)からのアクセスを適切な新アドレスにリダイレクトしようとした。
Webサーバーのルートディレクトリ
/www/
とする。
サーバーのドメイン設定
https://example.com/を/www/に対応させている。
WordPressのインストール先
ルートディレクトリ(/www/)直下に作成した”blog”ディレクトリ(blog/)にインストールしていた。
ディレクトリ構成はこのまま維持。
WordPressのサイトアドレス変更
WordPressのインストール先であるblogディレクトリにある”.htaccess”ファイルと”index.php”ファイルを、
ルートディレクトリ(/www/)にコピー
index.phpファイルについて以下の部分を編集
/** Loads the WordPress Environment and Template */ 変更前:require( dirname( __FILE__ ) . '/wp-blog-header.php' ); ↓ 変更後:require( dirname( __FILE__ ) . '/blog/wp-blog-header.php' );
WordPressのダッシュボードにてサイトアドレスを変更
ダッシュボードの「設定」→「一般」にて
「サイトアドレス(URL)」を
https://example.com/blog/
から
https://example.com/
に変更
ここまで来れば、あとはルートディレクトリ(/www/)の.htaccessにリダイレクト設定を記述してやれば作業完了!、、、となるはずだった。
リダイレクト内容が全く反映されないorz。
問題の原因と解決
原因:インストールディレクトリ(blog/)に置きっぱなしにしていた”.htaccess”ファイル
先の作業で”.htaccess”ファイルをインストールディレクトリ(blog/)からルートディレクトリ(/www/)にコピーした。
その時、インストールディレクトリ(blog/)の”.htaccess”ファイルをそのままにしていた。
ルートディレクトリ下の.htaccessがインストールディレクトリ下の.htaccessと競合していたか?
ゆえに、
解決:インストールディレクトリ(blog/)下の”.htaccess”ファイルの内容を全消去して保存
無事にリダイレクト設定が反映されるようになった。めでたし。
補足:.htaccessのリダイレクト設定について
WordPressのカテゴリIDをパラメータとした旧URLのリダイレクト
まずサイトのトップページへのアクセスについて
旧アドレス:https://example.com/blog/
を
新アドレス:https://example.com/
にリダイレクト
また、
カテゴリidが15であるパラメータ(下記”?”に続いているのがパラメータ)のリダイレクト
旧アドレス;https://example.com/blog/?cat=15
を
新アドレス:https://example.com/tag/new
にリダイレクトする場合の記述
(※WordPressによって先に記述されている”# BEGIN WordPress”で始まる行よりも前に記述する必要がある。)
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^cat=15$ RewriteCond %{HTTPS} on RewriteRule ^blog/$ https://example/tag/new/? [R=301,L] RewriteRule ^blog/$ https://example/ [R=301,L] </IfModule>
WordPress独自のサイト内リダイレクト機能を停止
WordPressには存在しないアドレスのアクセスについて、それらしいアドレスに勝手にリダイレクトしてくれる機能がありますが、なんとなくリダイレクトされていたので.htaccessが機能していないことに気づくのが遅れました。
WordPressのリダイレクト機能の停止はfunctions.phpに以下を記述
//---------------------------------------------------- //自動リダイレクトを停止 //---------------------------------------------------- function stop_redirect( $redirect_url ) { if ( is_404() ) return false; return $redirect_url; } add_filter( 'redirect_canonical', 'stop_redirect' );