/etc/httpd/conf.d/にある2つの別々のconfファイルから2つの仮想ホストをロードし、ブラウザでvhost1.test.comを指すと、vhost2.test.com index.htmlのように正しくロードされます。ただし、Webサーバーは2番目の仮想ホストをサーバーのワイルドカードドメインとして応答し、foo.test.comのDNSエントリを作成すると、vhost2のページがロードされます。 vhost2の設定を削除すると、vhost1でも同じ動作が発生します。構成で最後にロードされた仮想サーバーがワイルドカードドメインになるのはなぜですか?この設定では、ブラウザでtest.comを指してワイルドカードをロードすると、Apacheはデフォルトのドキュメントルートである/var/www/htmlも無視します。 vhost.confがロードされていない場合は、/var/www/htmlのドキュメントが期待どおりにロードされます。
virtualhost1.conf
<VirtualHost *:80>
DocumentRoot /vhost1
ServerName vhost1.test.com
ErrorLog logs/vhost1-error_log
CustomLog logs/vhost1-access_log common
<Directory "/vhost1">
order deny,allow
Require all granted
Allow from localhost 127.0.0.1 192.168.
</Directory>
virtualhost2.conf
<VirtualHost *:80>
DocumentRoot /vhost2
ServerName vhost2.test.com
ErrorLog logs/vhost2-error_log
CustomLog logs/vhost2-access_log common
<Directory "/vhost2">
order deny,allow
Require all granted
Allow from localhost 127.0.0.1 192.168.
</Directory>
ベストアンサー1
Apacheドキュメントからサーバーが正しい名前ベースの仮想ホストを選択する方法
IPとポートの組み合わせのためのデフォルト名ベースの仮想ホスト
最も具体的には、一致するIPアドレスとポートの組み合わせを含む仮想ホストセットに一致するServerNameまたはServerAliasが見つからない場合は、最初にリストされた一致する仮想ホストが使用されます。
したがって、DNSが存在しない「foo.test.com」を指す場合、HTTPリクエストにはhost: foo.test.com
ApacheがVHOSTの1つと一致できないヘッダーエントリが含まれるため、常にVHOSTコンテナを含む最初のファイル。
ファイルはアルファベット順にリストされているため、最初のファイルはアルファベット順のリストの最も低いファイルになります。
したがって、実際にはVHOST(またはより重要なのは対応するファイル名)が次のような場合:
- 仮想ホスト1
- 仮想ホスト2
仮想ホスト1ApacheがIPアドレスまたはホスト名で特定のVHOSTに対する要求を一致させることができない場合は、常にその要求が提供されます。
はい、初めて知るとかなり衝撃的です。そのため、一部のApacheパッケージはファイル名でデフォルトの仮想ホストを定義します000_default_vhost
。
これにより、要求がVHOSTのホスト名またはIPの不一致であることを保証できます。 VHOSTは常に提供されます。 404を含む要求は間違いなく「正しい」ドメインに対するものではないため、
サーバーは常に要求を拒否するようにサーバーを構成することを検討する必要があります。これがApacheに対する不合理な動作のように見える場合は、nginxも同じように動作します。 nginxを使用し、サーバー名が定義されていない要求の処理を防止したい場合000_default_vhost
要求のみを削除するサーバーを定義することもできます。
server {
listen 80;
server_name "";
return 444;
}
アルファベット順に最初に出てくるファイルに入れてください。/etc/nginx/sites-available/000_catchall