適当プログラマー

.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 %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

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

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

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

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

三行目と四行目で「もしwwwがついてるならばwwwを取り除く」という処理をしています。

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

以下、詳細の解説です。

RewriteEngine On

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

RewriteCond

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

%{HTTP_HOST} ^www\.(.*)$ [NC]
%{HTTP_HOST}でホスト名(「yahoo.co.jp」や「www.example.com」の部分)を取得しています。「^」は正規表現の行頭、「\.」は「.」に対してエスケープ文字を使用し、「.」が特別な意味を持たないようにしています。「(.*)」は「任意の0文字以上の文字」です。ここで「()」を使用しているのは、RewriteRuleの後方参照で「%1」で使用するためです。「$」は正規表現の行末、[NC]は「大文字小文字を区別しない」という意味です。分かりやすく言えば「ホスト名が『www.』や『WWW.』や『WWw.』で始まっている場合は」という条件になります。
RewriteRule

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

^(.*)$ https://%1/$1 [R=301,L]
^(.*)$ の「^」は行頭、「(.*)」は「0文字以上の任意の文字(カッコで囲っているのは、あとで$1で使用するためです)」、「$」が行末という意味です。ここで、アドレス全てを指定しています。次のhttps://%1/$1で、wwwなしのアドレスに変更しています。%1には直前のRewriteCondの(.*)で取得したホスト名「yahoo.co.jp」や「example.com」などが入り、次の$1にはページ名が入ります。単純に「wwwなしのアドレスに修正する」という理解で大丈夫です。
[R=301,L]

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

RewriteCond

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

%{HTTPS} !on

onに否定の意味の「!」がついているので「もしhttpsでアクセスされていない場合は」という意味です。

RewriteRule

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

(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

(.*)は正規表現「0文字以上」を意味します。(多分)アドレス文字全体を変換対象として指定しています。次のhttps://%{HTTP_HOST}%{REQUEST_URI}で単純にhttpをhttpsに変換し、それ以外のホスト名(%{HTTP_HOST)やページ名(%{REQUEST_URI})は現在のものをそのまま使用しています。

[R=301,L]

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

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

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

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