2026年9月14日
2026年9月14日
ApacheのServerNameとServerAliasの違い|VirtualHostの書き方・www転送・SSL証明書との関係
ServerName と ServerAlias は、Apache が「このリクエストはどのサイト(VirtualHost)のものか」を決めるときに使う設定です。どちらもドメイン名を書きますが、役割は同じではありません。この記事では2つの違いと、www あり・なしの統一、HTTPS の設定までを説明します。
例は2026年10月時点の Apache 2.4 系で、パスは Ubuntu / Debian を基本にし、RHEL 系(AlmaLinux・Rocky Linux)の違いは都度書いています。
ServerNameとServerAliasの違い
| 項目 | ServerName |
ServerAlias |
|---|---|---|
| 書ける数 | VirtualHost ごとに1つ | 空白区切りで複数。ServerAlias の行を複数書いてもよい |
| ワイルドカード | 使えない | * と ? が使える(例: *.example.com) |
| 役割 | そのサイトの正式な名前。VirtualHost の照合にも使われる | 同じサイトとして扱う別名。照合にだけ使われる |
| 自分自身を指す URL | Apache が自分の URL を組み立てるときに使う(UseCanonicalName On のとき) |
使われない |
Apache は、リクエストの Host ヘッダー(ブラウザーが送ってくるドメイン名)を、同じ IP アドレスとポートで待ち受けている VirtualHost の ServerName と ServerAlias に順に照らし合わせ、一致した VirtualHost で応答します。
ここで大事なのは、ServerAlias が転送(リダイレクト)をしないことです。ServerAlias www.example.com と書くと、www.example.com へのアクセスにも同じ内容をそのまま返します。アドレスバーの URL は www.example.com のままで、検索エンジンから見ると同じ内容のページが2つの URL に存在することになります。1つの URL にまとめたい場合は、後で説明するリダイレクトの設定が別に必要です。
どのVirtualHostが選ばれるか
Hostヘッダーに一致するServerNameまたはServerAliasを持つ VirtualHost が選ばれます。- どれにも一致しない場合は、その IP アドレスとポートで最初に定義された VirtualHost が使われます(既定のサイト)。IP アドレスで直接アクセスされた場合もこれにあたります。
- VirtualHost の中に
ServerNameを書かないと、サーバー全体のServerNameが引き継がれます。名前で区別できなくなるので、VirtualHost ごとに書きます。
Ubuntu の 000-default.conf のように、既定のサイトがファイル名の順で先に読まれることに注意してください。サイトの設定ファイルは sites-enabled/ 内のファイル名順に読み込まれます。
基本のVirtualHostを書く
Ubuntu / Debian では /etc/apache2/sites-available/ にサイトごとの設定ファイルを作ります。
# /etc/apache2/sites-available/example.com.conf
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
sudo a2ensite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
RHEL 系では /etc/httpd/conf.d/example.com.conf に同じ内容を書き(${APACHE_LOG_DIR} の代わりに logs/example.com-error_log などを指定)、sudo apachectl configtest と sudo systemctl reload httpd で反映します。メインの httpd.conf を直接書き換える必要はありません。
wwwあり・なしを1つのURLに統一する
www.example.com へのアクセスを example.com に転送したい場合は、www 用の VirtualHost を別に作り、Redirect で恒久的な転送(301)を返します。転送先の VirtualHost には www.example.com を ServerAlias として書きません。
# 転送するだけの VirtualHost
<VirtualHost *:80>
ServerName www.example.com
Redirect permanent / http://example.com/
</VirtualHost>
# 本来のサイト
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example.com/public
</VirtualHost>
Redirect は、指定したパス以降をそのまま引き継いで転送します。http://www.example.com/about/ へのアクセスは http://example.com/about/ に転送されます。HTTPS を使うなら、転送先は https:// で書きます(次の節)。
WordPress の場合は、管理画面の「設定」→「一般」にある「WordPress アドレス (URL)」と「サイトアドレス (URL)」も、統一した側の URL にそろえておきます。
HTTPSのVirtualHostと証明書
HTTPS(443番ポート)は、80番とは別の VirtualHost として書きます。ServerName と ServerAlias に書いたすべての名前が、証明書に含まれている必要があります。証明書に含まれない名前でアクセスされると、ブラウザーに証明書エラーが出ます。転送するだけの www 用 VirtualHost でも、HTTPS で受けるならその名前が証明書に入っていなければなりません。
Let's Encrypt の certbot で両方の名前を含む証明書を取る例です(Ubuntu の場合)。
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com
certbot の Apache プラグインは、80番の VirtualHost の ServerName・ServerAlias をもとに HTTPS 用の設定を作ります。手動で書く場合は次のようになります。
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example.com/public
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
# HTTP はすべて HTTPS の正式な URL へ
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
SSLEngine などを使うには mod_ssl が必要です。Ubuntu では sudo a2enmod ssl、RHEL 系では sudo dnf install mod_ssl で有効にします。Apache 2.4.8 以降では、中間証明書は SSLCertificateChainFile ではなく、SSLCertificateFile に指定するファイル(Let's Encrypt なら fullchain.pem)に含めます。
1つの IP アドレスで複数の HTTPS サイトを名前で分けられるのは、ブラウザーが TLS の接続時に SNI でドメイン名を送るためです。現在の主要なブラウザーはすべて SNI に対応しています。
設定を確認する
どの名前がどの VirtualHost に割り当てられているかは、-S オプションで一覧にできます。
# Ubuntu / Debian
sudo apache2ctl -S
# RHEL 系
sudo apachectl -S
出力には、ポートごとに既定の VirtualHost(default server)と、各 VirtualHost の ServerName・alias と設定ファイルの位置が表示されます。意図した名前が並んでいるか、既定のサイトがどれになっているかを確かめます。
実際の応答は curl で確認できます。DNS を切り替える前でも、--resolve でサーバーの IP アドレスを指定して試せます(192.0.2.10 は例のアドレス)。
# 301 と Location: https://example.com/ が返ること
curl -sI http://www.example.com/
curl -sI --resolve www.example.com:443:192.0.2.10 https://www.example.com/
よくあるつまずき
- 起動時の AH00558 の警告:
AH00558: Could not reliably determine the server's fully qualified domain nameは、サーバー全体のServerNameが無いときの警告です。Ubuntu では/etc/apache2/conf-available/servername.confにServerNameの1行(例:ServerName server1.example.com)を書き、sudo a2enconf servernameで有効にします。RHEL 系ではhttpd.confのServerNameを設定します。VirtualHost の動作には影響しません。 - 別のサイトが表示される: 名前が一致する VirtualHost が無く、既定のサイトで応答しています。
apache2ctl -Sで名前の綴りと、同じ名前を複数の VirtualHost に書いていないかを確認します。同じ名前が重複すると、先に読み込まれた VirtualHost が使われます。 - wwwありで証明書エラーが出る: 証明書に
www.example.comが含まれていません。sudo openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -text | grep -A1 "Subject Alternative Name"で、証明書に含まれる名前を確認できます。名前を足すときは、certbot を-dに全部の名前を並べて実行し直します。