サイトのリニューアルやコンテンツの構造を変更する場合に、.htaccessを使ってリダイレクトの設定を行います。
通常は単純なリダイレクトを行うことが多いですが、たまに複雑なリダイレクトをする場合に困ることが多く、リダイレクト設定について分かることをまとめてみました。

index

mod_rewriteを使ったリダイレクト

.htaccessでリダイレクトする場合はmod_rewriteの機能を実行しています。 主に使うのは次の3つの機能です。

  • Redirect機能
  • RedirectMatch機能
  • Rewrite機能

通常のリダイレクトを行う場合は、Redirect機能を使います。 RedirectMatch機能とRewrite機能を使う場合は、ある程度正規表現を理解しておく必要があります。

Redirect機能

単順にリダイレクトする場合に使います。設定は簡単です。

リダイレクトをさせる転送元を指定し、その指定されたディレクトリやページを全て転送させます。

Redirect 301 <旧URLパス> <新URL>

※Redirect permanent ~としても同じように301リダイレクトが行われます。

例)「https://xxxx.com/test/」を「https://example.comm/」へリダイレクトする場合

Redirect 301 /test/ https://example.com/

RedirectMatch機能

ファイルの種類や基点などの条件を正規表現を使って指定し、対象に含まれるものを転送します。

RedirectMatch 301 <旧URLパスの正規表現> <新URL>

例)jpgファイルを全て別サーバーにリダイレクトする場合

RedirectMatch (.*)¥.jpg$ https://example.com$1.jpg

Rewrite機能

環境変数を利用した複雑な指定ができ、アクセスされたパス以外の条件を参照する事もできるます。

RewriteEngine On
RewriteRule <旧URLパスの正規表現> <新URL> [R=301,L]

RewriteRuleを使うときは、旧URLパスに先頭の/を含めません。

例)「https://xxxx.com/index.html」を「https://xxxx.com/new/index.html」へリダイレクトする場合

^index\.html$ /new/index.html

.htaccessでよく使われる正規表現

.htaccessでよく使われる正規表現をまとめてみました。 これだけ知っていると結構応用出来ます。

パターン 意味
. 任意の1文字
[ ] "いずれかの1文字
[abe]ではa,b,cいずれかの1文字
[a-z]では、aからzまでアルファベットの小文字で1文字
[-A-Z]では、「-」という文字あるいはアルファベットの大文字で1文字
[-0-9a-zA-Z]では、「-」という文字あるいは0から9、
あるいはアルファベットの小文字か大文字でいずれか1文字
[^] これら以外の1文字
[^abcd]は、a,b,c,d以外の1文字
[^0-9]は、数字以外の1文字
( ) グループ化(選択肢の境界設定、後方参照のために使用する)一般的に (.*) のように使われる
^ 行頭(文字位置の指定)
$ 行末(文字位置の指定)
\文字 "エスケープ処理:通常の文字として扱う。
「.」は任意の1文字を表現する正規表現「.」と間違うので、例えば画像の場合は\.jpgと表記する"
- "置換を禁止するアクセス禁止の時などに使用"
! パターンの前に用いる事でパターンを否定する命令
* 直前の文字が0回以上繰り返す時
.* 任意の文字
$1 受け取ったURLを再利用

よく使うリダイレクトの事例

サイトのドメインを変更

サイトのディレクトリ構造が同じで、ドメインのみ変更したい場合

RewriteEngine On
RewriteRule (.*) http://example.com/$1 [R=301,L]

サイトのSSL化

下記の記載で「http」部分を「https」に置換します。

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

ファイル名のみ変更

「https://xxxx.com/aaa.html」を「https://xxxx.com/bbb.html」へリダイレクト

RewriteRule ^aaa.html$ bbb.html [L,R=301]

ディレクトリ名のみ変更

例1)「https://xxxx.com/aaa/」を「https://xxxx.com/bbb/」へ

RewriteRule ^aaa/$ /bbb/ [L,R=301]

例2)「https://xxxx.com/aaa/bbb/」を「https://xxxx.com/aaa/」へ

RewriteRule ^aaa/bbb/$ /aaa/ [L,R=301]

例3)「https://xxxx.com/aaa/」を「https://xxxx.com/aaa/bbb/」へ

RewriteRule ^aaa/$ /aaa/bbb/ [L,R=301]

ディレクトリとファイル名の変更

ディレクトリもファイル名も変更したい場合 例)「https://xxxx.com/aaa/bbb.html」を「https://xxxx.com/ccc.html」へ

RewriteRule ^aaa/bbb.html$ /ccc.html [R=301,L]

ディレクトリ表記のページがファイル表記になる時

例)「https://xxxx.com/aaa/」を「https://xxxx.com/bbb/ccc.html」へ

RewriteRule ^aaa/$ /bbb/ccc.html [R=301,L]

ディレクトリ名の変更をディレクトリ以下のファイルにも適用したい時

ここでは後方参照というのを使います。

後方参照は、()で囲まれた部分を、後に出てくる実行命令で参照するということです。

例1)「https://xxxx.com/bbb/aaa.html」を「https://xxxx.com/ccc/aaa.html」へ

RewriteRule ^bbb(.*)$ /ccc$1 [R=301,L]

^の部分が行頭、$の部分が行末を示し、^(.*)$で「aaa.html」を受け入れ、aaa.htmlが$1の部分へと後方参照されます。

例2)「https://xxxx.com/bbb.html」を「https://xxxx.com/abc/bbb.html」へ

RewriteRule ^(.*)$ abc/$1

例3)「https://xxxx.com/cat/0123.html」を「https://xxxx.com/blog/0123.html」へ

RewriteRule ^cat(.*)$ /blog$1 [L,R=301]

例4)https://xxxx.com/abc/bbb.html を https://xxxx.com/ccc/bbb.html へ

RewriteRule ^.*/(.*)$ ccc/$1

この時RewriteRuleの条件対象は「abc/bbb.html」です。 .*には「abc」の部分、(.*)」には「bbb.html」が入り、「ccc/$1」の部分が「ccc/bbb.html」となります。

※一つ目の.*()で囲まれていないので後方参照されません。

参考サイト

前の記事 次の記事