VirtualHostでname-basedとIP-basedを混在させる

IPv4アドレスは節約したいけど、IPv6アドレスは潤沢に使える場合などのちょっとしたメモ。httpd.confはこんな感じになる。

 Listen 123.45.67.89:80
 Listen [2001:3e0:4eb:9999:8000]:80
 Listen [2001:3e0:4eb:9999:8001]:80
 
 NameVirtualHost 123.45.67.89:80
 
 <VirtualHost 123.45.67.89:80 [2001:3e0:4eb:9999:8000]:80>
    DocumentRoot "/home/web/example.jp/htdocs"
    ServerName www.example.jp
 </VirtualHost>
 
 <VirtualHost 123.45.67.89:80 [2001:3e0:4eb:9999:8001]:80>
    DocumentRoot "/home/web/example.com/htdocs"
    ServerName www.example.com
 </VirtualHost>

DNSはこんなかんじで。

 www.example.jp.	IN	A	123.45.67.89
 www.example.jp.	IN	AAAA	2001:3e0:4eb:9999:8000
 www.example.com.	IN	A	123.45.67.89
 www.example.com.	IN	AAAA	2001:3e0:4eb:9999:8001

IPv4アドレス(一つしか割り振らないアドレス)NameVirtualHostを指定するのがポイント。あとは一纏めにしたいIPアドレスをVirtualHost指示子にスペースで区切って記述。別にIPv6じゃなくても、IPv4グローバルアドレスは一個しかないけど、プライベートアドレスはたくさんある、なんて状況でもおいしくいただけます。

ホストエントリにワイルドカードを指定

たとえばexample.jpドメインで全て同じVirtualHostに対応させたい場合。www.example.jpでもweb.example.jpでもexample.jpでもwwwwwwwwwwwwwwwwwwwwwww.example.jpでも・・・・

DNSはこう

 example.jp.	IN	A	123.45.67.89
 *.example.jp.	IN	A	123.45.67.89

httpd.confは、

 Listen 123.45.67.89:80
 <VirtualHost 123.45.67.89:80>
    DocumentRoot "/home/web/example.jp/htdocs"
    ServerName example.jp
    ServerAlias *.example.jp
 </VirtualHost>

ServerNameはもちろん、ServerAliasもname-basedの時にHost:リクエストヘッダとマッチさせて、どのVirtualHostに遷移するかを指定できる。文字通りエイリアス。ここでワイルドカードを指定してやり、example.jpドメインのどの名前が来ても同じVirtualHostがマッチさせる。IPv6の場合は適宜アレンジしましょう。

覚え書きと言っても2つしか思いつかなかったけど、またなんか覚えたり思い出したりしたら書きます。