Mod_Rewriteとは・・・Webサーバーである「Apache(アパッチ)」上で利用することができる機能です。
機能内容を簡単にいえば、ユーザー(又は検索エンジン)からのリクエストにあるURL情報を、変更し「リダイレクト」する事ができます。
例えば、
「Aさん」というユーザーが、当サイト(https://viral-community.com)へアクセスするとします。
この時、「Aさん」は、当サイトのWebサーバー(Apache)に対して、
「https://viral-community.com のページヘ、アクセスしたいよ~」とリクエストを送ります。
もし、この時「Mod_Rewrite」が機能していれば、このリクエストのURL情報:https://viral-community.com を、別のURL「http://●●●●●.com」へ変更し、このURLへリダイレクトします。
この結果、「Aさん」は強制的に「http://●●●●●.com」にアクセスすることになるのです。
これが、「Mod_Rewrite」の基本的な機能になります。
今回の記事では、この「Mod_Rewrite」の特徴や、利用シーン。また利用手順について解説していきます。
以下、目次になります。
- Mod_Rewriteの利用シーン
- Mod_Rewriteの特徴
- Mod_Rewriteを使って、リダイレクト設定する手順
Mod_Rewriteの利用シーン
上述している通り、「Mod_Rewrite」は、ユーザー(検索エンジン)からリクエストを受けた際に、別のサイト(ページ)へリダイレクトする機能になります。
サイト管理者が「Mod_Rewrite」を利用するシーンは主に下記二点になるかと思います。
-
「サイトのドメインを移転する or サイト内の構造を変更する(URLに関わる部分)場合」
利用シーンとして最も多いのは、サイトのドメインを移転する場合だと思います。
要は、サイトのお引越しですね。この場合、ユーザーや検索エンジン(クローラー)が、引っ越し前のサイトへ訪れた時の対策として、新しいサイトへのリダイレクトを設定しておく必要があります(「クローラー」については、こちらで解説しています→クローラーとは?「Googlebot」にクローリングさせたい場合とさせたくない場合の対処法)
※検索エンジン(クローラー)を対象に入れているのは、引っ越し前のサイトに対して検索エンジンからの評価(SEO的な評価)がされている場合に、その評価を新しいサイトへ引き継ぐことを理由としているためです。
特に、引っ越し前のサイトがいくつかの「検索キーワード」で上位表示されているなど、検索エンジンからの評価が高かった場合は、必ず新しいサイトへリダイレクト設定しておきましょう。
また、ドメインの変更じゃなく、サイト内での「URLの変更を伴う構造の変更」をする場合も注意が必要です。
例えば、ディレクトリの変更によって、URLが下記のように変更する場合
「viral-community.com/old/●●●.html」 → 「viral-community.com/new/●●●.html」このような場合も、変更前のディレクトリを削除するのではなく、保持しておいて、かつ変更後のディレクトリへリダイレクト設定する事をオススメします(特に、検索エンジンからの評価が高い場合)
また、単にページURLを変更する場合も同様です(下記、例)
「viral-community.com/seo/old.html」 → 「viral-community.com/seo/new.html」 -
「サイト内に重複コンテンツがある場合」
こちらは、主に「SEO対策」をおこなっているサイト管理者が対象となります。
サイト内に、コンテンツ内容は一緒なのに、複数のページが存在している場合、どのページがオリジナルのページなのかを明確にしておく必要があります。
なぜなら、コンテンツが重複しているにも関わらず、ページURLが複数あるので、その分「検索エンジンからの評価」が分散されてしまうからです。
例えば、「WWWのあり・なし」(下記)
・http://www.viral-community.com
・https://viral-community.comこの二つは、コンテンツ内容は全く一緒なのに、URLが違っているため、検索エンジンからの評価は、二つに分散されてしまいます。
なので、分散されているだけ評価は低くなり、結果的に上位表示されにくい状態となっているわけです。
そこで、重複コンテンツがある場合は、オリジナルのページを決めて、「このページがオリジナルですよ」と検索エンジンに対して明確化してあげる必要があります。
そのための一つの方法が、「リダイレクト」になります(解決方法自体はいくつかあって、詳しくはこちらにまとめています→正規化とは?サイトのページURLを正規化する必要性と方法についてまとめてみた)
以上です。
Mod_Rewriteの特徴
実は、「Mod_Rewrite」を利用しなくても、Apacheのデフォルトで用意されている機能や、「PHP」によって、リダイレクトをすることは可能です。
※「Mod_Rewrite」を利用せずに、リダイレクトをおこなう方法に関してはこちらで解説しています→「301リダイレクトについて、必要性と設定手順をまとめてみた」
ですが、「Mod_Rewrite」を利用した方が効率的にリダイレクト設定できるという場合が、往々にしてあるので、下記に「Mod_Rewrite」の特徴をまとめました。
- さまざまな環境変数を利用して、リダイレクト設定できる
- 正規表現を利用した柔軟な条件指定をおこなえる(自由度の高い、URLのパス部分の記述ができる)
以上です。どちらも詳しくは、後述している設定(記述)例で、解説しています。
Mod_Rewriteを使って、リダイレクト設定する手順
上述している通り、「Mod_Rewrite」はApache上で機能するものなので、前提条件としてWebサーバーに「Apache」を利用している必要があります。
また、具体的な設定の話しになりますが、「Mod_Rewrite」は、「.htaccess」というファイルに記述することで機能させることができます。
なので、「.htaccess」の利用が許可されている事も必須条件となります。
※レンタルサーバーを利用している場合は、ほとんどのサーバーがWebサーバーに「Apache」を採用していますし、「.htaccess」の利用も許可されているので、心配する事はないでしょう(レンタルサーバーについては、こちらで解説しています→レンタルサーバーを選定する際の9つの軸で、3つのおすすめサーバーを比較してみる)
当章では、上記条件を満たしている事を前提に、「.htaccess」への記述例を交えて、「Mod_Rewrite」を用いたリダイレクトの設定手順を解説していきます。
では、まず「.htaccess」を作成します。
この時、Windows環境では、「.htaccess」というネーミングでファイル作成ができないので、「●●●.htaccess」というファイルを作成します(後で、名前は「.htaccess」へ変更します)
【以下、作成例】
作成したら、次はこのファイルを「メモ帳」などのエディタで開いてください(下図例)
エディタで開けたら、
次は、「Mod_Rewrite」を用いたリダイレクト設定を、記述していきます。
まずは、記述例を見てみましょう(下記)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(viral-community\.com)(:80)? [NC]
RewriteRule ^(.*) http://●●●●●.com/$1 [R=301,L]
初めて見る方は、難しそうに感じますが、
上記の意味としては、「viral-community.com」ドメインにアクセスしたら、「●●●●●.com」ドメインへ、リダイレクトするといった意味になります。
では一行一行、具体的に意味を解読していきます(下記)
-
「RewriteEngine on」:「Mod_Rewrite」機能の有効化
-
「RewriteCond」:次の「RewriteRule」を実行するかどうかの条件文になります
要は、「RewriteCond」の条件を通れば、次の「RewriteRule」は実行され、通らなければ実行はされません。
構文としては、「RewriteCond A B 」となり、A と B がマッチすれば、次の「RewriteRule」が実行されます。
では、上の例を見て行きましょう(下記)
RewriteCond %{HTTP_HOST} ^(viral-community\.com)(:80)? [NC]
上記で言えば、「A」にあたるのが %{HTTP_HOST} で、「B」にあたるのが、^(viral-community\.com)(:80)? になります。
以下、各要素の詳細になります。
・%{HTTP_HOST}・・・{HTTP_HOST}は、環境変数になります({}で記載されるものは、全て環境変数になります)
また、% は環境変数の前に必ず付きます。
HTTP_HOSTとは、ユーザーがリクエストを送ったホスト(ドメイン)になります。・^(viral-community\.com)(:80)?・・・^ と ? と \ は正規表現で、viral-community.com はドメインです(. の前には、正規表現の \ を付けなければなりません)
また、(:80)は、ポート80番の事です(HTTPでの通信は80番ポートを使っているため、このように指定されています)
? の正規表現によって、(:80)はあってもなくても良いということになります(下記、どちらでも良いということです)・viral-community.com
・viral-community.com:80※正規表現についてはこちらが参考になります→サルにもわかる正規表現入門(「その一」から「その四」まであります)
・[NC]・・・RewriteCondのオプションになります。[NC]は、大文字小文字を意識しない(どちらでも良い)条件とするオプションとなります([]で記載されるものは、全てオプションとなります)
これらを総合すると、ユーザーがリクエストを送ったホスト(ドメイン)が、「viral-community.com」だった場合、条件とマッチするという事になります。
-
「RewriteRule」:URL変更(リダイレクト)を行うルールの定義文になります。
ユーザーからリクエストのあったURLが、条件に指定しているURLに一致した場合、変更先のURLへ変更がおこなわれ、リダイレクトされます。
構文としては、「RewriteRule A B 」となり、ユーザーからリクエストのあったURLが「A」であれば、「B」のURLへリダイレクトされます。
では、上述している記述例を見て行きましょう(下記)
RewriteRule ^(.*) http://●●●●●.com/$1 [R=301,L]
上記で言えば、「A」にあたるのが ^(.*) で、「B」にあたるのが、http://●●●●●.com/$1 になります。
以下、各要素の詳細になります。
・^(.*)・・・こちらの表記は、(カッコ含め)すべて正規表現になります。
.* の組み合わせはよく使われ、”任意文字の連続” といった意味になります。なので、「^(.*)」は、どのようなURLでもOK!ということになります。
要は、無条件で条件とマッチするという事になります。・http://●●●●●.com/$1・・・こちらは、リダイレクト先のURLになります。
$1 は、同じ行で使われている「正規表現の()で括った部分に、マッチした文字列」を参照するといった意味になります。記述例(下記)で言えば、(.*)が該当します。
RewriteRule ^(.*) http://●●●●●.com/$1 [R=301,L]
また、$2、$3、$4・・・と指定することもでき、これは「正規表現の()で括った部分」が複数存在する場合に使われます。
・[R=301,L]・・・こちらは、RewriteRuleのオプションになります。
今回は、二つ「R=301」と「L」が指定されています。
「R=301」のRとは ”リダイレクトのR” で、「R=301」とする事で、301リダイレクトを指定する事になります。
また、301を指定しない場合(「R」のみの場合)は、302リダイレクトとなります。次に「L」ですが、こちらは ”LastのL” となり、(「L」が指定されている)RewriteRuleの条件にマッチした場合、以降のRewriteRuleを処理しない事を意味します。
上述している「RewriteRule」を総合すると、ユーザーからのリクエストがあった場合、無条件に「●●●●●.com」ドメインへ301リダイレクトをする。といった意味になります。
以上です。
「正規表現」を知らなかった人は、ハードルが高いですが、上記を理解する事ができれば、ある程度の基本的な構文(記述)に関しては理解できるでしょう。
シチュエーション(状況)や、用途(やりたい事)ごとの記述例を下記にまとめているので確認しておいてください。
・301リダイレクトについて:「mod_Rewrite」が利用できる場合の設定手順
では、次のステップですが、「●●●.htaccess」への記載が終わったら、内容を保存して、「htaccess」ファイルを配置すべき場所(上記リンク先を参考)へ、FFFTPなどの「FTPツール」を利用してアップロードしてください(下図参考)
アップロードできたら、「●●●.htaccess」の ”●●●”を消して、ファイル名を「.htaccess」に変更してください(下図参考)
以上です。
これで、設定は完了なので、ちゃんと「リダイレクト」されているかの確認を行ってください。
※今回、当記事を作成するうえで参考にさせていただいたサイト→dawgsdk.org:mod_rewriteリファレンス