
Apache/Ubuntu を使用して localhost 上で実行している Web サイトがいくつかあります。
私は、これらのうちの 1 つ ( と呼びます) に自己署名証明書を正常にインストールしましたsecuresite.local
。別の非 SSL サイト ( と呼びます)insecuresite.local
も期待どおりに動作します。
つまり、
https://securesite.local
http://insecuresite.local
これらはそれぞれ正しいコンテンツを提供します。
しかし、私がhttp://securesite.local
そこへ移動すると、insecure.local
私の/etc/hostsには
127.0.1.1 securesite.local
127.0.1.1 insecuresite.local
/etc/apache2/apache2.confには
IncludeOptional sites-enabled/*.conf
securesite または insecuresite への明示的な参照は含まれていません。
ls /etc/apache2/sites-enabled
securesite.conf insecuresite.conf
insecuresite.confには(ここでは省略)が含まれています
<VirtualHost insecuresite.local:80>
ServerName insecuresite.local
ServerAlias insecuresite.local
# ...
securesite.confには以下が含まれています(ここでは省略)
<VirtualHost securesite.local:443>
ServerName securesite.local
ServerAlias securesite.local
# ...
Apache が 443 以外のポート経由で securesite.local への接続を拒否し、localhost:80 でのトラフィックを許可している他のサイトからのコンテンツの提供にフォールバックしないようにします。
なぜこのようなことが起こるのでしょうか、またどうすれば止められるのでしょうか?
答え1
insecuresite.confとsecuresite.confファイルによると、一方はポート80でリッスンしており、もう一方は443でリッスンしています。http://securesite.localブラウザはポート 80 からデータを要求していますが、ポート 80 で提供されているのは insecuresite.local のみです。
これを修正するには、 securesite.local:80 の仮想ホストを定義し、https にリダイレクトする必要があります。また、NameVirtualHost *
apache2.conf ファイルに次の内容が含まれていることを確認する必要があります。
2 つの conf ファイルは次のようになります。
<VirtualHost *:80>
ServerName insecuresite.local
ServerAlias insecuresite.local
# ...
そして
<VirtualHost *:80>
ServerName securesite.local
ServerAlias securesite.local
Redirect permanent / https://securesite.local
# ...
<VirtualHost *:443>
ServerName securesite.local
ServerAlias securesite.local
# ...
NameVirtualHost オプションを有効にすると、Apache は ServerNames と ServerAliases を調べ、それに応じてデータを提供します。
答え2
ソケットはバインドされ、接続はホスト名ではなく IP アドレスです。両方の仮想ホストは同一のIPアドレスを持っているため、リスナーソケットは両方に1つしかなく、Apacheはどのドメインが要求されるかを知ることができません。後接続を受け入れたので、HTTP リクエスト (または TLS SNI ハンドシェイク) を受信する必要があります。
ファイルは、sites-enabled
文字順に読み取られるため、またはそれに類似した名前のファイルに「フォールバック」仮想ホストを設定できますsites-enabled/00-default.conf
。(言い換えると、同じ IP の他の仮想ホストの前にリストします。)