バーチャルホストのサーバ名別名でVirtualHost設定を簡素に

ApacheにはServerAliasなるディレクティブがあります。
今更知ることになり、なんて便利なんだ!と感動したのでこの勢いで紹介します!

ServerAliasのない世界

よくあるパターンですが、URLにwwwを入れるか入れないか、どちらかに統一したいという話がよくあると思います。
私はこの設定を今までのこんな感じでやってました。

NameVirtualHost *:80

<VirtualHost *:80>
  ServerAdmin admin@nautilus.xyz
  DocumentRoot /srv/www/default
  ServerName www.nautilus.xyz
  <ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.nautilus.xyz
    RewriteRule ^(.*)$ http://nautilus.xyz%{REQUEST_URI} [R=301,L]
  </ifModule>
  ...
</VirtualHost>

<VirtualHost *:80>
  ServerAdmin admin@nautilus.xyz
  DocumentRoot /srv/www/default
  ServerName nautilus.xyz
  ...
</VirtualHost>

このケースでは、www.nautlus.xyz => nautilus.xyzにリダイレクトしています。wwwを削除する方向に統一。うーん、ザ・冗長。www.nautilus.xyzとnautilus.xyzの両方のバーチャルホスト設定を書いてます。wwwの方は使わないのにね…
いろいろ設定書くって事は、変更あったら両方とも修正しないといけないから修正漏れとか書き間違いとかトラブルの種がその分増えるって事。設定ファイルもプログラムも書かないに越したことはないよね。

そこでServerAliasくんの登場ですよ。

ServerAliasのある世界

ServerAliasを使うとこんな感じに書き換えることができます。

NameVirtualHost *:80
<VirtualHost *:80>
  ServerAdmin admin@nautilus.xyz
  DocumentRoot /srv/www/default
  ServerName nautilus.xyz
  ServerAlias www.nautilus.xyz
  <ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.nautilus.xyz
    RewriteRule ^(.*)$ http://nautilus.xyz%{REQUEST_URI} [R=301,L]
  </ifModule>
  ...
</VirtualHost>

バーチャルホストの設定を一つにまとめることができるわけです。
基本的に、nautilus.xyzのバーチャルホストとして、この設定を使う別のドメインをServerAliasとして設定しておきます。そして、ServerAliasのドメインでアクセスしてきたリクエストはnautilus.xyzにリダイレクト。

設定が一つになって、すっきり!うれしい!

こんなこと誰でも知ってるよ!ということかもしれないけど、これは便利だとおもいましたまる