適当プログラマー

.htaccessはサーバーにアップするだけでいいよ。

アイキャッチ

.htaccessでhttps化かつwwwありに統一するクールな方法

こんにちは。以前、.htaccessでwwwありに統一する方法と、.htaccessでwwwなしに統一する方法を記事にしたことがあるんだけど「https化する方法も書いてほしい」とリクエストを頂いたので、今回は「https化する」かつ「wwwありに統一する」クールな書き方を解説しようと思う。

さて皆さん。.htaccessで「https化」し、かつ「wwwあり」に統一する書き方を他のサイトで色々見たと思う。でも、それらのほとんどの方法がクールじゃない。なぜクールじゃないのか?なぜなら、.htaccessファイルに、自分のサイトのドメインを直に書いているからだ。

.htaccessファイルにサイトのドメインを直に書いていると、どのような問題があるのか?

上記のような問題がある。特に、自分のサイトのドメインが何らかの事情で変更になった時、.htaccessのドメインの修正を忘れる、なんていう事はいかにも起きそうなことだ。

そこで、今回は.htaccessを使って「https化」し、URLを「wwwあり」に統一する。ただし、.htaccessに自分のドメインを書かないで、っていう方法を紹介しようと思う。

なお、この方法を教えるのは私ではない。クールな外国人だ!!っていうわけで、こういうクールな方法は大体、クールな外国人がクールな英語で解説してるものなんですよ。っていうわけで、ググりました。見つけました。

具体的な.htaccessの書き方は以下になります。

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

この.htaccessを使えば、例えばあなたのサイトのアドレスが http://example.com だった場合、このアドレスへアクセスすると自動的に https://www.example.com へリダイレクトされます。やったぜ!

というわけで、この.htaccessの中身の解説だ。

大きく解説すると一行目のRewriteEngine Onでリダイレクト機能を有効にしてます。

二行目と三行目で「もしhttpsでないならばhttpsにする」という処理をしています。

四行目と五行目で「もしwwwがついてないならばwwwをつける」という処理をしています。

以下、詳細の解説です。

RewriteEngine On

Rewrite機能を有効にします。Rewrite機能とは、アクセスのあったURLを、正規表現で書き換えてから処理する機能です(参考:URLを書き換える -Rewrite機能 | Smart)。

RewriteCond

RewriteCondはRewriteRuleを実行するための条件を定義するための記述です。「RewriteCond条件」に合致した場合に、3行目の「RewriteRule」を実行します。というわけで、具体的な「RewriteCond条件」は %{HTTPS} off の部分という事になります。

%{HTTPS} off
「HTTPSでのアクセスではない場合」という意味です。
RewriteRule

RewriteCondの条件に当てはまった場合は、RewriteRuleを実行します。具体的な実行内容は.* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]の部分です。

.*

これは正規表現「0文字以上」を意味します。(多分)アドレス文字全体を変換対象として指定しています。

https://%{HTTP_HOST}%{REQUEST_URI}

単純にhttpをhttpsに変換し、それ以外のホスト名(%{HTTP_HOST)やページ名(%{REQUEST_URI})は現在のものをそのまま使用しています。

[L,R=301]

R=301とは、「301リダイレクト」することを意味します。Lとは、「RewriteCond」の条件にあてはまった書き換えルールはこの「RewriteRule」で終わり、ということを意味します(.htaccessでは、その気になれば、RewriteRuleを複数書くことが出来ます)。

RewriteCond

RewriteCondはRewriteRuleを実行するための条件を定義するための記述です。「RewriteCond条件」に合致した場合に、5行目の「RewriteRule」を実行します。というわけで、具体的な「RewriteCond条件」は %{HTTP_HOST} !^www\. [NC] の部分という事になります。

%{HTTP_HOST} !^www\. [NC]

%{HTTP_HOST}はホスト名を表しています。例えば「yahoo.co.jp」や「www.example.com」などの部分のことです。次の「!^www\.」は正規表現です。「!」は否定、「^」は行頭、「\」は、次の「.」が特殊な意味を持たないようにするためのエスケープ文字です(「.」はエスケープ文字を使用しない場合は「任意の一文字」という特殊な意味を持ってしまいます)。つまり「ホスト名がwww.で始まっていない場合は」という条件になります。[NC]は「大文字と小文字を区別しない」という意味です。つまり「www.」だけでなく「WWW.」や「Www.」で始まっていない場合も対象になります。

RewriteRule

RewriteCondの条件に当てはまった場合は、RewriteRuleを実行します。具体的な実行内容は.* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]の部分です。

.*

これは正規表現「0文字以上」を意味します。(多分)アドレス文字全体を変換対象として指定しています。

https://www.%{HTTP_HOST}%{REQUEST_URI}

単純にアドレスにwww.を追加しています。ホスト名(%{HTTTP_HOST})とページ名(%{REQUEST_URI})は現在と同じ物を使用しています。

[L,R=301]

R=301とは、「301リダイレクト」することを意味します。Lとは、「RewriteCond」の条件にあてはまった書き換えルールはこの「RewriteRule」で終わり、ということを意味します(.htaccessでは、その気になれば、RewriteRuleを複数書くことが出来ます)。

みたいな感じだよ!さすが外国人だよ!クールだよ!

というわけで、このクールな方法をサイトに載せてくれている、クールな外国人のソース(情報源)はapache - htaccess redirect to https://www - Stack Overflowです。

このエントリーをはてなブックマークに追加