.htaccessでサイトのリダイレクト

2018.04.13

サイトを引っ越しするときやページ移転するときにリダイレクト(転送)させる方法になります。

Rewrite機能をONにする

RewriteEngine on

まずはRewrite機能をONにしてURLの書き換えを可能にします。一度ONにしておけば毎度書かなくてOKです。初期値はoff。

URL書き換えのベースになるURLを指定

RewriteBase /

htaccessが設置されたディレクトリを基準にします。転送元ではなく、転送後のURLを基準にします。

リダイレクトの書き方

ページ単位のリダイレクト

例)旧URL http://example.com/old.html
例)新URL http://example.com/new.html

RewriteRule ^old.html$ http://example.com/new.html [R=301,L]

※新URLはhttpから始まるフルパスで。
正規表現で^は行の先頭、$は行の最後を意味します。

ディレクトリ単位のリダイレクト

例)旧ページ http://example.com/old/index.html
例)新ページ http://example.com/new/index.html

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

正規表現で.*はあらゆる文字列、( )で囲むと後方の$1に代入されます。

ドメイン全体のリダイレクト

例)旧ページ http://example-old.com
例)新ページ http://example-new.com

RewriteCond %{HTTP_HOST} ^example-old.com
RewriteRule ^(.*) http://example-new.com/$1 [R=301,L]

RewriteCondがある場合、直後に記述されているRewriteRuleRewriteCondの条件に満たされている場合のみ実行されます。

wwwあり・なしの統一

wwwありの場合

RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

wwwなしの場合

RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

index.htmlなしのURLに統一

RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://example.com/$1 [R=301,L]

特定のディレクトリをリダイレクトから除外

RewriteCond %{REQUEST_URI} !(^/除外ディレクトリ名/)
RewriteRule ^$ http://example.com/ [R=301,L]

書き方例

RewriteEngine on
RewriteBase /
#ドメインwwwなしに統一
RewriteCond %{HTTP_HOST} ^www\.example\.com
RewriteRule (.*) http://example.com/$1 [R=301,L]
#ディレクトリ単位のリダイレクト
RewriteRule ^old(.*)$ /new$1 [R=301,L] 
#ページ単位のリダイレクト
RewriteRule ^old.html$ http://example.com/new.html [R=301,L]
RewriteEngine off

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

301 永久に移動するという意味を持つ。引っ越しやページ移動のときに使用。
302 一時的に移動するという意味を持つ。メンテナンスページや期間限定のキャンペーンページなどに使用。

その他

[R=301] 301リダイレクトをしなさいという指定になります。
[L] 処理終わり(LAST)の意味。[L]だけだと302リダイレクトになるので必ず[R=301]の指定をするようにします。

関連記事