ブログの始め方・WordPress・レンタルサーバー

.htaccessで特定ページへのリダイレクトが効かない原因と対処法

.htaccessで特定ページへのリダイレクトが効かない原因と対処法

記事を移転するときや、2つ以上の記事を整理するときに「.htaccess」を編集して301リダイレクトを設定します。

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

この記事では、htaccessの301リダイレクトが効かない原因と対処法、特定ページへのリダイレクト方法を解説します。正確に書いているのにリダイレクトできないときは、おそらくキャッシュが原因です。

WordPress環境での説明になります。

.htaccessで特定ページへのリダイレクトが効かないとき

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

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

これには落とし穴があります

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

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

リダイレクトできない例と修正例は次のようになります

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

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

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

注意点は4つあります。以下で詳しく説明していきます。

  • /$の使い方に注意する(正規表現)
  • # BEGIN WordPressよりも上に書く
  • 正確に書いているのにリダイレクトが効かないときは、おそらくキャッシュが原因
  • いきなり301指定しない

文字列の判定を間違うとリダイレクトは効かない

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

  • ^:文字列の先頭にマッチする
  • $:文字列の末尾にマッチする

リダイレクトできない例

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

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

理由は、old-pageの後に/がないからです。

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

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

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

修正例1(/を追加)

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

old-pageの後に/を追加しています。

WordPerssではURLの最後に/が付く場合が多いです。

^hogehoge/$
# 'hogehoge/'だけにマッチする。'hogehoge/'の後に文字が続いているとNG

修正例2($を削除)

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

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/

# 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のリダイレクトが効かないときは確認してください。

301のキャッシュが原因でリダイレクトが効いていないように見える

色々試しているうちにブラウザが301リダイレクトのキャッシュを持ってしまい、

その後正確に書いても、キャッシュが優先されてリダイレクトが効いていないように見えることは非常に多いです。

301リダイレクトのブラウザキャッシュを削除する方法を試してください。

301リダイレクトのブラウザキャッシュは非常に強力です。通常のブラウザキャッシュとは削除方法が異なるので注意してください。

いきなり301リダイレクトしてはいけない理由

301リダイレクトはブラウザにキャッシュされます。

このブラウザキャッシュは超強力です。スーパーリロードでも削除できません。

恒久的に転送したいときは301リダイレクトを使うことになりますが、URLを間違えると、ずっとそのURLにリダイレクトされ続けます。.htaccessを修正してもキャッシュが優先されるので変更が効きません。

編集者のブラウザであれば301リダイレクトのブラウザキャッシュを削除する方法でキャッシュを削除できます。

しかしユーザーやクローラーが間違ったURLにアクセスした場合は致命的です。

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

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

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

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

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リダイレクトのキャッシュが削除されます。

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

httpからhttpsへリダイレクトできないとき

httpから httpsへリダイレクトは301リダイレクトを使用します。

httpからhttpsへリダイレクトできないときはコードの記述位置に注意してください

WordPressの場合、.htaccessの一番上に書くのが好ましいです。一番上に書くことで別のURL変更処理(リダイレクトなど)の影響を受けなくなります。

次のコードを.htaccessの一番上に追加してください。

# httpからhttpsへリダイレクトする
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

これでhttpへのアクセスがhttpsに301リダイレクトされるようになります。

コードの解説

<IfModule mod_rewrite.c> # mod_rewriteが有効な場合のみ処理を行う
# 処理内容

</IfModule>

<IfModule mod_rewrite.c>はサーバーがmod_rewriteに対応している場合に処理を行います。mod_rewriteはURLの書き換え・変更を行うApacheのモジュールです。

mod_rewriteに対応していないサーバーでもエラーが起こらずに済みます。mod_rewriteに対応していないサーバーでは.htaccessを使ったリダイレクト自体が行えません。

WordPressが使えるサーバーのほとんどはmod_rewriteに対応しています。以下は対応しているサーバーの例です。

  • エックスサーバー
  • スターサーバー
  • mixhost
  • ロリポップ
  • カラフルボックス
  • ConoHa Wing
# mod_rewriteの機能を有効にする
RewriteEngine On

mod_rewriteの機能を有効にするための宣言です。offと書けば無効になります。

# 条件設定
RewriteCond %{HTTPS} off

「httpsが無効のとき」という条件を表しています。

RewriteCondはURL書き換えを行う条件を指定するものです。RewriteCondの条件が満たされる場合、直後に記述されたRewritwRuleが実行されます。

例として、RewriteCond %{HTTP_HOST} ^www\.example\.com$と書けば、www付きのURLの場合に処理を行うことができます。URLをwwwなしに統一したい場合に使えます。

# URLをhttpsに書き換える
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

URLをhttpsに書き換えています。

[R=301,L]のRはリダイレクトを表します。R=301なら301リダイレクト、R=302なら302リダイレクトです。

Lは正規表現パターンにマッチしたときURL変換を終了することを意味しています。

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

301と302の最も大きな違いは「リンクジュース(被リンク)を引き継ぐかどうか」です。

301はリンクジュースを引き継ぎ、302は引き継ぎません。

301と302リダイレクトの違い301リダイレクト302リダイレクト
期間恒久一時的
ユーザー転送する転送する
検索クローラー転送する転送する
被リンク引き継ぐ引き継がない
ブラウザキャッシュ恒久的にキャッシュされるキャッシュされない

301リダイレクトと302リダイレクトはそれぞれ用途が大きく異なります。

使用方法を誤ると検索結果に悪影響を及ぼす可能性があるため、違いを理解した上で利用してください。

301リダイレクトの特徴

301リダイレクトは恒久的なリダイレクトです。

301リダイレクトはhttpからhttpsへSSL化した場合や、過去サイトの被リンクを引き継いでサイトを移転したいときに使用します。

 301 Moved Permanently リダイレクトステータスコードは、リクエストされたリソースが Location ヘッダーで示された URL へ完全に移動したことを示します。ブラウザーはこのページにリダイレクトし、検索エンジンはリソースへのリンクを更新します。(「SEO 用語」では、「リンクジュース」が新しい URL に送られたと言われます)。

301 Moved Permanently

301リダイレクトを使用例

  • httpからhttpsへリダイレクトする
  • 過去サイトの被リンクを引き継いでサイトを移転する
  • 類似する内容がある複数のページを1つにまとめる

301リダイレクトで指定したURLはブラウザにキャッシュされて残り続けます。

独自に転送設定を行う場合、301リダイレクトがブラウザにキャッシュされる点には特に注意してください

上で説明したように「リダイレクトが効いていないように見える」原因になります。

301リダイレクトを使う場合は、指定したURLが間違っていないか事前に確認してください。確認には302リダイレクトが便利です。

302リダイレクトの特徴

302リダイレクトは一時的なリダイレクトで一定の期間だけユーザーと検索クローラーを対象のページへ飛ばします。

302リダイレクトは被リンクを引き継がず検索順位への影響がないため2つのWebサイト間で機能やデザインの確認をしたいといったテスト的な目的で使用できます。

302 Found リダイレクトステータスレスポンスコードは、リクエストされたリソースが一時的に Location で示された URL へ移動したことを示します。ブラウザーはこのページにリダイレクトしますが、検索エンジンはリソースへのリンクを更新しません。 (「SEO 用語」では、「リンクジュース」が新しい URL に送られなかったと言われます)。

302 Found

302リダイレクトを使用例

  • サイトのメンテナンス
  • リダイレクトが正常に機能するか確認する
  • 一時的に別ページにリダイレクトしてその後元に戻す場合

htaccessとは、そもそも何に使うものなのか?

htaccessは正確には.htaccess(ドット・エイチティ・アクセス)という名前のファイルで、Webサーバーソフトウェア「Apache」の設定ファイルです。

htaccessは次のような目的で使用します。

  • ディレクトリのサーバー設定を変更する
  • リダイレクトで検索エンジンの評価分散を避ける
  • サイト全体にパスワードをかける
  • IPアドレスのブロック

.htaccessを使うには .htaccessをサーバーのディレクトリに配置します。WordPressの場合は自動で作成されている場合が多いです。

サーバーに .htaccessが存在しない場合は手動で作成すれば利用できます。

Window環境でファイル名の先頭に「.」を入れる場合「.htaccess.」のように前後にドットを付けます。

検索エンジンの評価分散を避ける

リダイレクトは、検索エンジンのページ評価分散を避ける目的で使用する場合が多いです。

httpからhttpsへSSL化した場合、httpsのURLへのリダイレクト設定が必要になります。

リダイレクトしない場合、検索エンジンの評価が2つのページに分散してしまい正当な価値を得ることができません。

検索エンジンはhttpとhttpsのURLは別のページと認識するため2つのURLに対して評価を行います。その結果ページの評価が2つに分かれてしまい検索結果の順位が下がります。同じ内容のページが2つもインデックスされるのは重複の問題が発生することにもなります。

SSL化の後は検索エンジンの評価分散を避けるためにも、httpsへのリダイレクト設定を行う必要があります。

サイト全体にパスワードをかける

.htaccessを用いてサイトにパスワードを設定することをBasic認証と呼びます。

Basic認証を設定するとページの閲覧にユーザー名とパスワードを要求することができるようになります。

Webサイト作成を始めたばかりで準備が整っていないときや、メンテナンスで一時的にサイト全体を非公開にしたいときなど。.htaccessでBasic認証の設定をすれば、手軽にサイト全体または特定のページをパスワードで保護できます。

IPアドレスのブロック

.htaccessを使えば特定の国・地域・人のIPアドレスに対してのアクセス制限をかけることが可能です。

特定のIPアドレスがサーバーに大量のアクセスをして高い負荷をかけてた場合、それは不正アクセスのための攻撃かもしれません。または画像の直接リンクによる迷惑行為の可能性もあります。スパム対策のために国外からのアクセスを禁止したい場合もあるでしょう。

このような場合に .htaccessを使いアクセスの制限を設けることが可能になります。

htaccessの有効範囲

htaccessの有効範囲は .htaccessを設置したディレクトリ以下の階層すべて

.htaccessの有効範囲は .htaccessを設置したディレクトリ以下の階層すべてです。

階層の途中に更に .htaccessを置いた場合その設定内容が優先されます。

httpd.confがサーバー全体の設定を行うのに対し.htaccessはディレクトリごとにサーバーの設定を変更することができます。

htaccessとhttpd.confの違い

httpd.confはサーバー全体の設定です。

サーバーの管理者がサーバーの設定を変更するときはhtaccessではなくhttpd.confファイルを使用します。

一般ユーザーは管理者権限を持たないのでhttpd.confにはアクセスできません。

.htaccessとhttpd.confの違い.htaccesshttpd.conf
編集権限ユーザーが使用可能管理者のみ設定可能
設定範囲ディレクトリ単位サーバー全体

.htaccessが使用できるのはサーバーの管理者が使用を許可した場合です。許可されていないサーバーでは使用できません。

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

.htaccessでリダイレクトができないときや設定しているのに効かないときの対処法、特定ページへのリダイレクト方法を紹介しました。

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

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