リダイレクト設定用.htaccessの作成方法と記述方法

リダイレクトを目的とした.htaccessファイルの作成方法と、記述方法を整理する。ドット.から始まる特殊なファイルなので、作成時の注意点をまとめる。

ドメイン変更のための301リダイレクト

old.comnew.comへ301リダイレクトする。

RewriteEngine On
RewriteCond %{http_host} ^www.old.com
RewriteRule ^(.*) https://www.new.com/$1 [R=301,L]

簡単に書くなら下記もOK。

RewriteEngine On
Redirect permanent / https://www.new.com/

WWWなしに統一

SEO効果を目的にドメインをwww.aaa.comaaa.comに統一する。

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

SSL化リダイレクト

SSL化のためプロトコルをHTTPSに統一する。

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

存在しないファイルは全てアプリで処理する

WordPressなどのCMSで、存在するファイルは静的に表示し、存在しないファイルは全てアプリで処理させる。

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

コードの解説

  • <IfModule mod_rewrite.c>●●</IfModule>
    • mod_rewriteモジュール(Apacheで使用できるモジュールの一つ)が有効な場合は●●を実行するようにして、リスクを回避する
    • mod_rewrite が利用できない場合、エラーが発生するので、if 文で mod_rewrite が使えるなら「On」という記述を書く
  • mod_rewrite.c
    • mod_rewrite.cはApacheファイル群のどこかにあるソースファイル
  • RewriteEngine on
    • mod_rewriteモジュールを起動する宣言式
    • On:有効にする、Off:無効にする
  • RewriteCond {条件}
    • どういった場合にリダイレクト処理を実行するかどうかについて、条件(conditions)を指定する
  • RewriteRule {パターン} {置換内容} [R, L]
    • どのように書き換えるのかを指定でき、{パターン}に一致した部分を{置換内容}に書き換える。 [R={リダイレクト方式}]というように、どのような方式でリダイレクトさせるかも指定できる。 [ ]の中に L をつけることで、URL書き換え処理を終了する。

正規表現

^先頭とマッチ
$末尾とマッチ
.*任意の文字の連続(すべての文字列にマッチする)
(.*)リクエストされたパスをリダイレクト先でも使いたいので、(.*) とカッコでくくり後方参照の$1とすることで同じパスの違うドメインにリダイレクトさせる

記述方法を確認したのでもう一度リダイレクトルールを見てみよう。

ドメイン変更の301リダクレトのコード解説

RewriteEngine On
# %{http_host}
#   リクエスト先のサーバーのホスト名が格納された変数
#   www.old.comを指す
# ^www.old.com
#   ^は先頭とマッチし、$は末尾とマッチする。
#   先頭からwww.old.comで始まる文字列にマッチする
RewriteCond %{http_host} ^www.old.com

# ^(.*)
#   ドットは文字全てを、アスタリスクは0文字以上の繰り返しを表すので、
#   アクセスされたパスが0文字以上(=実質全て)の場合に転送を行う
# $1
#   正規表現のカッコ()で囲った部分の文字が入っている変数
#   転送後パスの記述に利用することができる
# [R=301]
#   HTTPステータスコード301を返してリダイレクトすることを表すフラグ
#   [L]は書き換えプロセスの終了を表すフラグ
RewriteRule ^(.*) https://www.new.com/$1 [R=301,L]

SSL化リダイレクトのコード解説

RewriteEngine on
# %{HTTPS}
#   リクエストがhttpsなら「ON」、httpなら「OFF」
#   httpsではない接続の場合にリダイレクト対象とする
RewriteCond %{HTTPS} off

# %{REQUEST_URI}
#   http://hoge.com/test/abc.phpなら/test/abc.phpの箇所
#   頭にスラッシュ/がつく
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]