適当プログラマー

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

アイキャッチ

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

以前に.htaccessでURLをwww有りに統一するクールな書き方という記事を書いたことがある。「wwwなしにする方法も無いですかね?」っていう問い合わせがあったので、今回はwww無しにする方法を書こうと思う。

ちなみに、問い合わせをうけて、試しに"htaccess www"というキーワードで検索してみたら、私の書いた.htaccessでURLをwww有りに統一するクールな書き方の記事がそこそこの順位で検索結果に出るので、ニヤニヤが止まらない。当時、この記事書いた時は「このクールな方法はまだ誰も書いてないから、きっと皆に大受けするぜ!?」ってワクワクしながらアップしたのに、全然検索結果にも出ないし、誰からもノーリアクションだったので悲しかったけど、やっぱりちゃんと良い記事書いてたら時間はかかっても検索されるようになるんだな。

ちなみに「wwwあり」にするか「wwwなし」にするかは好みの問題です。

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

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

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

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

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

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

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

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

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

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} ではホスト名を取得しています(例:example.com、www.example.netなど。参照:用語集「ドメイン・ホスト名とは?」)。つぎの ^www\.(.*) では正規表現を使用しています。^は「行頭」、\は「正規表現の特殊文字をエスケープ」、.は「任意の一文字(ですが、www\の後の.は\でエスケープされているので、「任意の一文字」という意味ではなく、「ドット」を意味します)」、*は「0回以上の繰り返し」、()は「グループ化(選択肢の境界を明示したり、後方参照のために使用する)」。つまり「^www\.(.*)」で、「その文章はwww.で始まっている。そして、その後、任意の文字が0文字以上続く(0回以上繰り返す)」という意味になります(参照:【mod_rewrite】正規表現 – mod rewrite)。また、[NC]はパターンについて文字の大文字(A-Z)と小文字(a-z)を区別しない、という意味です。つまり、「http://WWW.EXAMPLE.COM」も「http://www.example.com」も両方共対象にするよ、という意味です。ここで指定している条件は「もしホスト名がwww.もしくはWWW.という文字列で始まる記述で指定されていたら」という意味になります。

RewriteRule

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

^

これは(自信ないですがおそらく)正規表現です。^は「行頭」を意味します。おそらく、ここで^を指定することで、アドレス全体が変換対象となります。

http://%1%{REQUEST_URI}

ここでは、変換後のアドレスを指定しています。%1は、さきほどRewriteCondの方で指定した(.*)に置換されます(後方参照です)。つまり、http://www.example.comと指定した場合の「example.com」に置換されます。また、%{REQEST_URI}は指定されたURIを意味します。例えばhttp://example.com/abc.htmlにアクセスされた場合は/abc.htmlの文字のことで、http://example.com/dir1/dir2/go.phpにアクセスされた場合は/dir1/dir2/go.phpの文字のことです。これにより、「http://www.〜へアクセスされた場合はwww.なしのアドレスに書き換える」という条件が作れました。また、もし最初からwwwなしのアドレスにアクセスされた場合はRewriteCondの条件に一致しないので、このアドレス書き換え処理は発生しません。

[L,R=301]

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

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

というわけで、このクールな方法をサイトに載せてくれている、クールな外国人のソース(情報源)は apache - How to always remove WWW from a url with mod_rewrite? - Stack Overflowです。

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