ブログ初心者・Web制作の情報サイト
.htaccessで個別ページのリダイレクトができないときの対処法

.htaccessで個別ページのリダイレクトができないときの対処法

一部記事を移転するとき.htaccessを編集して301リダイレクトを設定します。

しかしネットの情報を参考にしてもリダイレクトできないことが多いです。

この記事ではhtaccessで個別ページのリダイレクトができないときの対処法と特定ページへのリダイレクト方法を紹介します。WordPress環境での説明になります。

特定ページのリダイレクトができないとき

.htaccessを使った特定ページのリダイレクト方法を調べると以下のようなコードを目にします。

RewriteEngine On
RewriteBase /
RewriteRule ^old-page.html$ https://example.com/new-page.html [R=301,L]

これには落とし穴があります。WordPressを使ってる人はこのコード通りに書いてもリダイレクトできない場合が多いです。

上のコードはURLに「.html」と付いてるように静的ページを想定しています。WordPressは動的にページとURLを生成するので状況が少し異なります。

注意点は3つあります。

  • 「# BEGIN WordPress」よりも上に書く
  • 「/」と「$」の使い方に注意する(正規表現)
  • いきなり301指定しない

“# BEGIN WordPress”よりも上に書く

WordPressは「# BEGIN WordPress」から始まるコードを.htaccessに書き込みます。

リダイレクト処理は「# BEGIN WordPress」よりも上に記述してください

# リダイレクト処理(「# BEGIN WordPress」よりも上に書く)
RewriteEngine On
RewriteBase /
RewriteRule ^old-page/$ https://example.com/new-page/ [R=302,L]

# BEGIN WordPress
# "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

「# END WordPress」以下にリダイレクト処理を書くとWordPress側の意図しないURL変更が入る可能性があります。.htaccessのリダイレクトができないときは一番最初に確認してください。

正規表現を正確に使う

「^」や「$」は文字列の判定を行う正規表現です。正規表現の指定が間違っているとリダイレクトされません。

# リダイレクトできない例
RewriteEngine On
RewriteBase /
RewriteRule ^old-page$ https://example.com/new-page/ [R=302,L]

# 修正例1(/を追加)
RewriteEngine On
RewriteBase /
RewriteRule ^old-page/$ https://example.com/new-page/ [R=302,L]

# 修正例2($を削除)
RewriteEngine On
RewriteBase /
RewriteRule ^old-page https://example.com/new-page/ [R=302,L]

リダイレクトできない例

ネット上でよく目にするコードを使って書いた例です。WordPress環境ではリダイレクトされません。

理由は「old-page」の後に「/」が無いからです。WordPerssではパーマリンクの独自カスタマイズをしていない限り、個別ページのURLの最後に「/」が付きます。

^hogehoge$
# 'hogehoge'と完全一致を表す。'hogehoge/'にはマッチしない。

上の正規表現は完全一致を表しています。URLに「/」が付いているとマッチしなくなります。

修正例1(/を追加)

「old-page」の後に「/」を追加しています。WordPerssではURLの最後に「/」が付く場合が多いです。

修正例2($を削除)

「old-page」の後の「$」を削除して正規表現を変更しています。

^hogehoge
# 'hogehoge'という文字列から始まることを意味する。'hogehoge'の後に文字が続いていてもOK

この方法を利用する場合、似ているURL(ページ分割等)は注意が必要です。指定した文字列から始まるURLは、すべて同一のページにリダイレクトされます。

RewriteRule ^hoge https://example.com/newpage/ [R=302,L]

# 上のように書いた場合、下記URLはどちらもhttps://exampel.com/newpage/にリダイレクトされる。

https://exampel.com/hoge/
https://exampel.com/hoge/page/2/

リダイレクトを確認するときは302を使う

リダイレクトが機能しているかどうか確認するときは必ず302リダイレクトを使ってください。

301リダイレクトと302リダイレクトの違い

301リダイレクトはブラウザにキャッシュされます。このブラウザキャッシュは非常に強力で、スーパーリロード(Ctrl + Shift + リロード)でも削除されません

302リダイレクトの方法

302リダイレクトを使う場合はR=302を指定します。

# 302リダイレクトを使う場合[R=302,L]を指定する
RewriteRule ^old-page/$ https://example.com/new-page/ [R=302,L]

いきなり301指定するのは危険

恒久的に転送したいときは301リダイレクトを使うことになりますが、

URLを間違えると、ずっとそのURLにリダイレクトされ続けます。.htaccessを修正してもキャッシュが優先されるので変更が効きません。

編集者のブラウザであれば301リダイレクトのブラウザキャッシュを削除する方法でキャッシュを削除できます。しかしユーザーやクローラーが間違ったURLにアクセスした場合は致命的です。

301リダイレクトのブラウザキャッシュは「リダイレクトできない問題」と合わさって非常に厄介です。

いきなり301を使うのではなく、302リダイレクトを利用して必ず確認を行ってください。

302リダイレクトが正常に動作していることを確認後、301リダイレクトに書き換えます。

# 301リダイレクトを使う場合[R=301,L]を指定する
RewriteRule ^old-page/$ https://example.com/new-page/ [R=301,L]

301リダイレクトのブラウザキャッシュを削除する

301リダイレクトのURLを間違えたときはブラウザキャッシュを削除します。301リダイレクトのキャッシュ削除方法は通常のキャッシュ削除とは異なります。

ブラウザキャッシュの消去方法

F12を押してデベロッパーツールを開きます。Macの場合は「command + option + I」

デベロッパーツールを開いた状態でページリロード右クリック > キャッシュの消去とハード再読み込み

301リダイレクトのブラウザキャッシュを削除する

これで301リダイレクトのキャッシュが削除されます。

リダイレクト設定が解除できないとき・設定が反映されないときは、この方法でブラウザキャッシュを削除してみてください。

WordPressでよく起こるリダイレクト問題

.htaccessで個別記事のリダイレクトができないときの対処法と特定ページへのリダイレクト方法を紹介しました。

WordPressサイトの記事を一部だけ移転させるとき、URLの違いが原因でリダイレクトできない問題がよく起こります。正規表現とURL指定を正しえば問題の解決は難しくありません。

301リダイレクトの扱いは少し厄介です。301と302の違いに注意して適切に使用してください。