ApacheでHTTPからHTTPSへの転送
Redirect HTTP to HTTPS using Virtual Host
Apache バーチャルホストはサーバでホストされている一つ以上のドメインの 設定を定義します。 バーチャルホストディレクティブでは、サイトドキュメントルート (ウェブサイトのファイルを含むディレクトリ) を指定したり、サイトごとに別々のセキュリティポリシーを作成したり、 異なる SSL 証明書を使用したり、リダイレクトを設定したりすることができます。
一般的に、SSL 証明書がドメインにインストールされているときは、 そのドメインに対して 2 つのバーチャルホストディレクティブがあります。 1つはポート 80 の HTTP バージョン用で、もう1つはポート 443 の HTTPS バージョン用です。
CentOSやFedoraのようなRed-Hatベースのディストロでは、バーチャルホストファイルは/etc/httpd/conf.dに保存されます。 一方、DebianやUbuntuのようなその派生版では、ファイルは/etc/apache2/sites-availableディレクトリに保存されます。
ウェブサイトを HTTPS にリダイレクトするには、以下の例のように Redirect ディレクティブを使用します:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com Redirect permanent / https://example.com/ </VirtualHost> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com Protocols h2 http/1.1 # SSL Configuration # Other Apache Configuration </VirtualHost>
HTTP 用と HTTPS 用の二つのバーチャルホストディレクティブを使っています。
- VirtualHost *:80 - Apache サーバは指定されたドメインのポート 80 (HTTP) で着信接続を待ち受けます。
- VirtualHost *:443 - Apache サーバーは指定されたドメインのポート 443 (HTTPS) で着信接続を待ち受けます。
ServerName と ServerAlias ディレクティブはバーチャルホストのドメイン名を指定します。 必ず自分のドメイン名に置き換えてください。
ハイライトされている行、Redirect permanent / https://example.com/ は HTTP バーチャルホストの内部で、トラフィックをサイトの HTTPS バージョンにリダイレクトします。
一般的には、HTTPSのwww版サイトを非www版にリダイレクトしたり、その逆も行います。以下に設定例を示します:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com Redirect permanent / https://example.com/ </VirtualHost> <VirtualHost *:443> ServerName example.com ServerAlias www.example.com Protocols h2 http/1.1 <If "%{HTTP_HOST} == 'www.example.com'"> Redirect permanent / https://example.com/ </If> # SSL Configuration # Other Apache Configuration </VirtualHost>
HTTPSバーチャルホスト内のコード(ハイライトされた行)は、リクエストヘッダにwwwドメインが含まれているかどうかをチェックし、wwwでないバージョンにリダイレクトします。
設定ファイルを変更するときはいつでも、変更を有効にするためにApacheサービスを再起動するかリロードする必要があります:
- DebianとUbuntu:
sudo systemctl reload apache2
- CentOSとFedora:
sudo systemctl reload httpd
Redirect HTTP to HTTPS using .htaccess
.htaccess は Apache ウェブサーバのディレクトリ毎の設定ファイルです。 このファイルは Apache がファイルを置くディレクトリからどのようにファイルを提供するかを定義したり、追加の機能をオン/オフにしたりするのに使われます。
通常、.htaccess ファイルはドメインルートディレクトリに置かれますが、 サブディレクトリに他の .htaccess ファイルを置くこともできます。
この方法では、mod_rewrite モジュールが Apache サーバにロードされている必要があります。 このモジュールはほとんどのサーバでデフォルトでロードされています。 可能であれば、バーチャルホストにリダイレクトを作成する方がシンプルで安全です。
すべてのHTTPトラフィックをHTTPSにリダイレクトするには、ルートの.htaccessファイルを開き、以下のコードを追加する:
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
コードの意味は以下の通りです:
RewriteEngine On
- Rewrite機能を有効にします。RewriteCond %{HTTPS} off
- HTTP接続をチェックし、条件を満たせば次の行を実行します。RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
- HTTPをステータスコード301(Moved Permanently)でHTTPSにリダイレクトします。必ずドメイン名を変更してください。
以下の例には、リクエストがwwwで始まるかどうかをチェックする追加条件があります。これを使用して、すべての訪問者がサイトのwwwでないHTTPSバージョンを使用するように強制します:
RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.example\.com [NC] RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
.htaccessファイルを編集する場合、Apacheはリクエストごとにファイルを読み込むので、サーバーを再起動する必要はありません。
結論
Apacheでは、HTTPをHTTPSにリダイレクトする望ましい方法は、ドメインのバーチャルホストで301リダイレクトを設定することです。