リダイレクトを目的とした.htaccess
ファイルの作成方法と、記述方法を整理する。ドット.
から始まる特殊なファイルなので、作成時の注意点をまとめる。
コンテンツ
ドメイン変更のための301リダイレクト
old.com
➡ new.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.com
➡ aaa.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]