適当プログラマー

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

アイキャッチ

.htaccessでURLをwww有りに統一するクールな書き方

今までうちのサイト、ガルニもではURLは「wwwあり」「wwwなし」どちらでもアクセスできるようにしてた。でも、SEO的に良くないし、ソーシャルボタン的にも良くないので、本当に今更ですが「wwwあり」に統一することにしました。

ちなみに「wwwあり」に統一するのか「wwwなし」に統一するのかは皆さん言っていますが好みだと思う。私の場合は大昔にGoogleのウェブマスターツールで確か「wwwありに統一する」っていう設定をしたんだよね。試しにGoogleで私のサイト検索したら「wwwあり」のサイトになるからね。よって今更「wwwなし」にする理由もないし「wwwあり」だ。

で、色々ググってみて.htaccessに書けばいいのは分かった。301リダイレクトでwwwありに転送できるんですね。書き方も色々と例示されてる。でもさ、.htaccessに自分のドメインを直に書いてるのばかりなんだよね。

それって望ましい書き方じゃないよね?例えば自分のサイトのアドレスが変わってしまった時に、.htaccessに書いている自分のアドレスも書き変えないといけない。っていうか、.htaccessに書いているアドレスって、いかにも修正し忘れそうだ。

また、.htaccessに、「wwwあり」「wwwなし」の設定以外にも色々と好みの設定を書いている場合は、新しく別のサイトを作るときに、この.htaccessを使いまわしたいと思うかもしれない。でも、使いまわす時にいちいち.htaccessを開いてドメインを書き変えるの?なにそれ?クールじゃないよね。

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

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

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

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

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

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

RewriteEngine On

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

RewriteCond

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

%{HTTP_HOST} !^www\.

%{HTTP_HOST} ではホスト名を取得しています(例:example.com、www.example.netなど。参照:用語集「ドメイン・ホスト名とは?」)。つぎの !^www\. では正規表現を使用しています。!は「否定」、^は「行頭」、\は「正規表現の特殊文字をエスケープ」、.は「任意の一文字(ですが、今回は\でエスケープされているので、「任意の一文字」という意味ではなく、「ドット」を意味します)」。つまり「^www\.」で、「その文章はwww.で始まっている」の意味。しかし、最初に否定を意味する!があるので「その文章はwww.で始まっていない」。つまり「ホスト名がwww.で始まっていない場合」という意味になります(参照:[.htaccess] リライト(サイトの移転・wwwの有無を統一・アクセス制限) | AIDREAM)。

RewriteRule

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

^(.*)$

これも正規表現です。^は「行頭」。.は「任意の一文字」。*は「直前の文字の0回以上の繰り返し」。$は「行末」。また、()で囲むことで、後で$1の様にして、その内容を取得できます。つまり、これは「始まりから終わりまで、どんな文字でもいい」すなわち「全ての文字」を意味します。例えばアクセスされたページが http://example.com/abc.html であった場合は abc.html の文字のことです。http://example.com/dir1/dir2/go.php であった場合は、 dir1/dir2/go.php の文字のことです。

http://www.%{HTTP_HOST}/$1

RewriteCondの条件に当てはまった場合の書き換え後のアドレスです。www.がついていなかったホスト名にwww.をつけています。$1には、 ^(.*)$ で取得した文字列、すなわち abc.html や dir1/dir2/go.php などが入ります。また、もし最初からホスト名にwww.がついていた場合(www.がついているアドレスにアクセスされた場合)は、そもそものRewriteCondの条件に当てはまらないので、このRewriteRuleは実行されません。

[R=301,L]

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

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

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

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