サイトの運営・管理していく中で、ページをクローズするのでそのページのアクセスを別のページに飛ばしたり、別のURLに内容を移設するといったシーンに出くわすことがあると思います。
その際に.htaccessによるリダイレクトの設定を覚えておくと、htmlのmeta要素だけではできないような設定が出来たり、一括で処理を行う事ができるのでとても便利です。
個人的に.htaccessを利用して良く使う設定方法をご紹介いたします。
.htaccessの基本
まずは前提として、サーバーで.htaccessが使える状態で無いと利用できません。サーバー管理者に.htaccessの利用可能かを確認して下さい。
環境が整えば.htaccessファイルを作成します。内容はテキストファイルですが名前の存在しないファイルをPC上では作れないので、手順が必要となります。
まずはFTPで利用したいサーバーにアクセスします。そこに中身が空白のテキストファイルをアップします。そのファイルをFTP上での名前変更で「.htaccess」とするとファイルを作れます。あとはそのファイルをPCにコピーしてくれば、PC上に.htaccessのファイルの完成です。
ファイルはテキストエディタで編集します。
.htaccessでリダイレクトを実行する為の記述方法
まず最初にリダイレクトをするという宣言「RewriteEngin on」を記述します。
後は「RewriteRule (リダイレクト元) (リダイレクト先) [転送オプション]」を記述するだけです。
- RewriteEngin on
- RewriteRule ^test/$ /hogehoge/ [R,L]
/test/ へのアクセスを /hogehoge/ にリダイレクトする設定です。
.htaccessを起点にディレクトリ位置は指定します。リダイレクト元は頭に「/」は必要ありません。「^]「$」は正規表現と呼ばれるものでここでは「^」先頭が「$」末尾がという意味となります。
リダイレクト先はドメイン指定からでも指定可能で、ドメインが変更される場合などは「https://~」記述する事で指定したURLに遷移します
転送方法は[]で囲まれた部分です。ここでは詳細は割愛しますが、基本的に[R,L]の記述を書くと覚えておけば良いかと思います。
リダイレクト元の指定方法事例
リダイレクト元では正規表現で指定すると記述しましたが。その指定方法についていくつか使える事例をご紹介します。
このURLだけをリダイレクトする(完全一致)
- RewriteEngin on
- RewriteRule ^test/pre.html$ /hogehoge/ [R,L]
「^」と「$」で囲みます。これで完全一致の場合のみリダイレクトされます。
「/test/」「/test/index.html」「/test/test/pre.html」これらのアクセスは全てリダイレクトとはなりません。
URLの一部が一致したらリダイレクトする(部分一致)
- RewriteEngin on
- RewriteRule test/ /hogehoge/ [R,L]
指定の前後に何も入れないと部分一致の場合のみリダイレクトされます。
「/test/」「/test/index.html」「/aaa/test/」これらのアクセスは全て「/hogehoge/」へリダイレクトされます。
URLの前方が一致したらリダイレクトする(前方一致)
- RewriteEngin on
- RewriteRule ^test/ /hogehoge/ [R,L]
「^」を頭に入れると前方一致の場合のみリダイレクトされます。
「/test/」「/test/aaa/」はリダイレクトされますが、「/aaa/test/」はリダイレクトとなりません。
URLの後方が一致したらリダイレクトする(後方一致)
- RewriteEngin on
- RewriteRule test/$ /hogehoge/ [R,L]
「$」を末尾に入れると後方一致の場合のみリダイレクトされます。
「/test/」「/aaa/test/」はリダイレクトされますが、「/test/aaa/」はリダイレクトとなりません。
パラメータを含んだリダイレクト
今までの記載方法の場合流入時のパラメータ(?以降の内容)はリダイレクト先でも引き継がれます。その部分をコントロールする場合は少し記述を変える必要があります。
リダイレクト先で任意のパラメータを付けた状態で遷移させる
- RewriteEngin on
- RewriteRule ^test/ /hogehoge/?aa=bb [R,L]
このケースは簡単で、リダイレクト先のURLをパラメータ付きにするだけで実現できます。このようにしておくと「test/?xx=zz」とアクセスが合っても「/hogehoge/?aa=bb」にリダイレクトされます。
リダイレクト元の特定のパラメータが付いていた場合にリダイレクトをする
- RewriteEngin on
- RewriteCond %{QUERY_STRING} aa=bb
- RewriteRule test/$ /hogehoge/ [R,L]
このケースは一行追加を行います。
「RewriteCond %{QUERY_STRING}」に指定するパラメータを正規表現で指定します。この場合は「/test/?aa=bb」はリダイレクトされますが、「/test/」はリダイレクトされません。
リダイレクト元のパラメータを残したままパラメータを追加する
- RewriteEngin on
- RewriteRule ^test/ /hogehoge/?aa=bb [R,L,QSA]
[]に囲った部分にQSAを追加します。こうすることで「test/?xx=zz」とアクセスが合った場合「/hogehoge/?aa=bb&xx=zz」となりパラメータが残ります。QSAが無い場合はリダイレクト後は「/hogehoge/?aa=bb」となります。
SEOを意識したリダイレクト指定
サイト運営を行うとSEOを意識する必要が出てくると思います。その為リダイレクトの意味をgoogleに伝える必要があります。パターンとして以下のどちらかを使う事になると思います。
301リダイレクト
- RewriteEngin on
- RewriteRule ^test/ /hogehoge/ [R=301,L]
301リダイレクトは「Permanet Redirect(恒久的な転送)」を意味し、googleに対してこのページはリダイレクト先に移動させましたと言う事を伝えます。そうする事でこのページが持っている評価をリダイレクト先に引継ぐ事ができます。
記述方法は特に難しくありません。Rの後ろの「=301」と追記するだけです。
302リダイレクト
- RewriteEngin on
- RewriteRule ^test/ /hogehoge/ [R=302,L]
302リダイレクトは「Templrary Redirect(一時的な転送)」を意味し、一時的にこのページが見れなくなるが近い将来このページが復活する際に使うコードです。昔は302はページ評価が引き継がれなかったのですが、今は引き継がれるようでそれほど301との違いがなくなっています。
こちらも記述はRの後ろの「=302」と追記するだけでが省略も可能です。ですの今まで紹介した[R,L]という記述は302リダイレクトで転送されます。
使えるリダイレクト指定事例
この項ではサイト全体で良く使われる指定方法の事例を紹介します。
ドメイン転送
- RewriteEngin on
- RewriteCond %{HTTP_HOST} ^www\.test\.com$
- RewriteRule ^(.*)$ http://www.hoge.com/$1 [R=301,L]
RewriteCond行に転送前のドメイン、RewriteRuleに転送後のドメインを記載します。注意としてはこの転送はwww.test.comに.htaccessを置く必要がある点です。そのサーバーの契約がすでに終了している場合はアクセスできずに転送が動きません。
index.html無しに統一
- RewriteEngin on
- RewriteCond %{THE_REQUEST} ^.*/index\.html
- RewriteRule ^(.*)/index\.html/$ /$1 [R=301,L]
/index.htmlのアクセスを全て「/」の表記に統一したい場合の記述方法です。
ドメインをwww有りで統一する
- RewriteEngin on
- RewriteCond %{HTTP_HOST} ^test\.com
- RewriteRule ^(.*) https://www\.test\.com/$1 [R=301,L]
「https://test.com」のアクセスを「https://www.test.com」で統一したい場合の記述方法です。
.htaccessの優先順位
各ディレクトリに.htaccessファイルを作成する事が出来ますが、その際に注意が必要で下位ディレクトリに.htaccessで「RewriteEngine on」の記述があると上位ディレクトリのリダイレクト設定が引き継がれません。
ディレクトリ毎で設定する事が便利な場合もありますが、やりすぎると設定全体の把握が出来なくなるのと全ページに適用したい設定などが出てくると更新が大変となるので、基本的にはルート直下のディレクトリでリダイレクトは管理するのがオススメです。
最後に
.htaccessは使えるとサイトコントロール幅が広がり効率化も図れます。一方で色々な機能と絡むので1つの記述ミスがサイト全体を機能不全とする可能性もあります。ですので、必ず本番でいきなり変更するのではなく開発環境で動作を確認してから実行するように注意してください。