mod_rewriteの基本

mod_rewriteを使っての転送(リダイレクト)に関する覚書です。

まずはその基本形から。

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

2行目はmod_rewriteの基点をドキュメントルートにするの意味。

3行目の「^」は行の先頭、「$」は行末、「(.*)」はなにかしらの文字が0文字以上あることを意味し、その文字列は$1へ代入されます。

最後の「R」はリダイレクト、「L」は条件にマッチするとRewriteRuleを終了するのオプション。
オプションには他に「OR」判定条件をorで次に続ける。「NC」判定条件の文字の大文字と小文字の区別をしない。
上記例の「R=301」は恒久的な転送を意味しますので、ページやディレクトリを削除した場合やサイトを引越した場合に使います。

ドメインをwwwありに統一

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

1行目[HTTP_HOST]は環境変数でユーザーに要求されたドメインを意味し、それが「domain-name.com」と一致した場合は、2行目を実行。
2行目は上に書いた基本文法を理解していれば、何をやってるか簡単に分かりますね。

httpアクセスを強制的にSSL暗号化通信(https)にする

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

2行目の環境変数REQUEST_URIはユーザーに要求されたリソース。
http://domain-name.com/company/index.htmlなら、「/company/index.html」の部分。

ちなみにその逆、httpsをhttpにするケース

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

おまけ

スマホサイトは別ドメインに転送させるコード

RewriteCond %{HTTP_USER_AGENT} (iPhone|Android|BlackBerry) 
RewriteRule ^(.*)$ https://スマートフォン用サイトのドメイン/$1 [R=302, L]

「R=302」の部分、ステータスコード302はFoundの意味で、一時的な転送に使用します。